Kotlinは初めてで、open
とpublic
のキーワードが混同されています。これらのキーワードの違いを教えてください。
open
キーワードは、「拡張機能のために開く」ことを意味します。
クラスの
open
アノテーションは、Javaのfinal
の反対です。他の人がこのクラスから継承できるようにします。 defaultにより、Kotlinのすべてのクラスはfinal
になり、これはEffective Java、Item 17:Design and document for継承または禁止。
また、オーバーライド可能にするメソッドについても明示する必要があります。これは、open
でマークされています。
open class Base {
open fun v() {}
fun nv() {}
}
public
キーワードは、クラス、関数などに適用できる可視性修飾子として機能します。他に何も明示的に指定されていない場合、public
がデフォルトであることに注意してください。
可視性修飾子を指定しない場合、
public
がデフォルトで使用されます。つまり、宣言はどこでも表示されます。
class A { ... }
in JavaはKotlinのopen class A { ... }
と同じです。final class B { ... }
in JavaはKotlinのclass B { ...}
と同じです。
public
とは関係ありません。
Kotlinでは、アクセス修飾子のないものはすべてデフォルトでpublic
です。定義で明示的にpublic
と言うことができますが、Kotlinでは必要ありません。
そう、
public class A { ... }
そして
class A { ... }
kotlinでも同じです。
openはJavaのFinalの反対です。クラスが「オープン」でない場合、継承できません。
class First{}
class Second:First(){} // Not allowed. Since 'First' is Final(as in Java) by default. Unless marked "open" it can't be inherited
オープンでパブリックと混同しないでください。 publicは可視性修飾子です
class Third{} // By default this is public
private class Fourth{}
class Fifth{
val third = Third() // No issues
val fourth = Fourth() // Can't access because Fourth is private
}
私はメモのためにここに置きました。他の誰かに役立つかもしれません:
open kotlinのクラスは、デフォルトではクラスが継承されないため、クラスを継承できることを意味します。
class Car{....}
class Supercar:Car{....} : // give an error
open Car2{....}
class Supercar:Car2{....} : // ok
public Javaのクラスは、クラスの可視性に関するものです(継承とは関係ありません:Javaのクラスがfinalでない限り、デフォルトで継承できます)。 kotlinでは、すべてのクラスはデフォルトでパブリックです。
open kotlinのメソッドは、デフォルトではメソッドがオーバーライドされていないため、メソッドをオーバーライドできることを意味します。代わりに、Javaですべてのメソッドをデフォルトでオーバーライドできます
openのメソッドクラスは、通常どおりデフォルトでオーバーライドできません(クラスが開いているかどうかは関係ありません)、オーバーライドできることを宣言する必要があります。
class Car{....}
class Supercar:Car{....} : // give an error
open Car2{....}
class Supercar:Car2{....} : // ok