web-dev-qa-db-ja.com

コトリンの「オープン」と「パブリック」の違いは何ですか?

Kotlinは初めてで、openpublicのキーワードが混同されています。これらのキーワードの違いを教えてください。

26
Sagun Raj Lage

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がデフォルトで使用されます。つまり、宣言はどこでも表示されます。

31
s1m0nw1

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でも同じです。

6
Naetmul

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
}
2
Prakash

私はメモのためにここに置きました。他の誰かに役立つかもしれません:

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

詳細については、 https://kotlinlang.org/docs/reference/classes.html

0
android_dev71