Kotlin:「静的な」継承可能な関数を作成するにはどうすればよいですか?

ジレ:

たとえば、両方の関数を使用できるように、拡張example()する型の関数を作成したいと考えていますChildParent

Child.example()
Parent.example()

これを行う最初の「明白な」方法は、のコンパニオンオブジェクトをParent使用することexample()ですが、これはを許可ませんChild

私が試した2番目の方法は、拡張関数をParent.Companion定義することでした。これは、コンパニオンオブジェクトを定義することを強いられるため、不便です。また、も許可さexample()れていませんChild

誰か私がこれを行う方法を知っていますか?

Jayson Minard:

あなたが求めているものは存在しません、あなたは尋ねているように見えます:

子孫のクラス参照からスーパークラスのコンパニオンオブジェクトメソッドを参照できますか

または多分あなたは尋ねています:

子孫の参照からスーパークラスの静的メンバーを参照できますか?

両方の答えはノーです。これが許可されないのはKotlinの設計によるものであり、意識的な決定であり、意図的なものでした。この決定を変更する場合は、YouTrackで問題を報告する必要がありますJavaのプログラマーは、静的メソッドの継承とオーバーライド、およびある参照から別の参照から呼び出されたときの動作と、動的ではなく静的に解決される方法に非常に混乱していました。Java 8チームは、静的メソッドをインターフェースに追加するときに混乱が生じる可能性があることを認識しているため、インターフェース参照によってのみ呼び出されるようにするKotlinのアプローチを採用しました。このタイプの悪夢を回避するために、Kotlinチームはそれを禁止しました。彼らがJavaの他の多くの紛らわしい側面を拒否したのと同じように。

他の回答(@voddanなど)では、コンパニオンオブジェクトを使用して構文を呼び出すのと同じ感覚が得られる回避策が提供されますが、質問で次のように述べられていても、コンパニオンオブジェクトを避けたいと言ってコメントでそれらを拒否します。それらを使用しようとしています。したがって、それらを使用したくない場合、答えは単に「いいえ」であり、実行できません

コンパニオンオブジェクトを取り除くには、拡張関数を「静的」な方法で呼び出すことができるかについて説明しますか?...それはまだ許可されていないのでがっかりするでしょう。

コンパニオンオブジェクトに戻って(申し訳ありませんが、ここでは栄光への1つの道です)、子のメソッドを手動で親に委任することもできます。

open class Parent {
    companion object { // required, sorry, no way around it!
        fun foo() = /* some cool logic here */
    }
}

class Child: Parent() {
    companion object {  // required, sorry, no way around it!
        fun foo() = Parent.foo() 
    }
}

または拡張機能として:

open class Parent {
    companion object {} // required, sorry, no way around it!
}

class Child: Parent() {
    companion object {} // required, sorry, no way around it!
}

fun Parent.Companion.foo() = /* some cool logic here */
fun Child.Companion.foo() = Parent.foo()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

継承可能なクラス変数を作成するにはどうすればよいですか?

分類Dev

JavaScript関数を継承するにはどうすればよいですか?

分類Dev

さまざまな継承された引数で関数をオーバーライドするにはどうすればよいですか(Swift)

分類Dev

再利用可能な関数を作成するにはどうすればよいですか?

分類Dev

再利用可能なjqueryクリック関数を作成するにはどうすればよいですか?

分類Dev

Awake()、Start()、UpdateおよびFixedUpdate()などのUnityのコールバック関数を正しく継承するにはどうすればよいですか?

分類Dev

Visioで多重継承矢印の関係を作成するにはどうすればよいですか?

分類Dev

別の関数のプロパティとメソッドを継承する関数をJavascriptで作成するにはどうすればよいですか?

分類Dev

C ++継承で要素を「非公開」にすることは可能ですか?そうでない場合はどうすればよいですか?

分類Dev

C ++でメンバー関数のみを継承するにはどうすればよいですか?

分類Dev

継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

分類Dev

関数を別のクラスからkotlinのアクティビティに継承するにはどうすればよいですか?

分類Dev

継承なしでDTOの重複を回避するにはどうすればよいですか?

分類Dev

可能な限り小さい数の変数を作成するにはどうすればよいですか?

分類Dev

PHPでbind_param()のような関数を作成するにはどうすればよいですか?

分類Dev

php で pow のような関数を作成するにはどうすればよいですか

分類Dev

EventHandlerから継承しないデリゲートからIObservableを作成するにはどうすればよいですか?

分類Dev

Python:他のABCから継承するABCを作成するにはどうすればよいですか?

分類Dev

Rで再帰的な作成関数を作成するにはどうすればよいですか?

分類Dev

wp_head()のような関数を作成するにはどうすればよいですか?

分類Dev

継承可能な形式でツールボタンの順序を変更するにはどうすればよいですか?

分類Dev

AからBを継承しながら、BからクラスAを継承するにはどうすればよいですか?

分類Dev

他のクラスから継承しないクラスを作成するにはどうすればよいですか?

分類Dev

reactjs関数オブジェクトで継承を行うにはどうすればよいですか?

分類Dev

Lodashのように(オプションで)連鎖可能な関数を作成するにはどうすればよいですか?

分類Dev

機能的なReactコンポーネント内に静的関数を作成するにはどうすればよいですか?

分類Dev

$ scopeを読み取らない$ scope関数を作成するにはどうすればよいですか?

分類Dev

$ scopeを読み取らない$ scope関数を作成するにはどうすればよいですか?

分類Dev

要素の関数を継続的に実行する、または終了しないようにするにはどうすればよいですか?

Related 関連記事

  1. 1

    継承可能なクラス変数を作成するにはどうすればよいですか?

  2. 2

    JavaScript関数を継承するにはどうすればよいですか?

  3. 3

    さまざまな継承された引数で関数をオーバーライドするにはどうすればよいですか(Swift)

  4. 4

    再利用可能な関数を作成するにはどうすればよいですか?

  5. 5

    再利用可能なjqueryクリック関数を作成するにはどうすればよいですか?

  6. 6

    Awake()、Start()、UpdateおよびFixedUpdate()などのUnityのコールバック関数を正しく継承するにはどうすればよいですか?

  7. 7

    Visioで多重継承矢印の関係を作成するにはどうすればよいですか?

  8. 8

    別の関数のプロパティとメソッドを継承する関数をJavascriptで作成するにはどうすればよいですか?

  9. 9

    C ++継承で要素を「非公開」にすることは可能ですか?そうでない場合はどうすればよいですか?

  10. 10

    C ++でメンバー関数のみを継承するにはどうすればよいですか?

  11. 11

    継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

  12. 12

    関数を別のクラスからkotlinのアクティビティに継承するにはどうすればよいですか?

  13. 13

    継承なしでDTOの重複を回避するにはどうすればよいですか?

  14. 14

    可能な限り小さい数の変数を作成するにはどうすればよいですか?

  15. 15

    PHPでbind_param()のような関数を作成するにはどうすればよいですか?

  16. 16

    php で pow のような関数を作成するにはどうすればよいですか

  17. 17

    EventHandlerから継承しないデリゲートからIObservableを作成するにはどうすればよいですか?

  18. 18

    Python:他のABCから継承するABCを作成するにはどうすればよいですか?

  19. 19

    Rで再帰的な作成関数を作成するにはどうすればよいですか?

  20. 20

    wp_head()のような関数を作成するにはどうすればよいですか?

  21. 21

    継承可能な形式でツールボタンの順序を変更するにはどうすればよいですか?

  22. 22

    AからBを継承しながら、BからクラスAを継承するにはどうすればよいですか?

  23. 23

    他のクラスから継承しないクラスを作成するにはどうすればよいですか?

  24. 24

    reactjs関数オブジェクトで継承を行うにはどうすればよいですか?

  25. 25

    Lodashのように(オプションで)連鎖可能な関数を作成するにはどうすればよいですか?

  26. 26

    機能的なReactコンポーネント内に静的関数を作成するにはどうすればよいですか?

  27. 27

    $ scopeを読み取らない$ scope関数を作成するにはどうすればよいですか?

  28. 28

    $ scopeを読み取らない$ scope関数を作成するにはどうすればよいですか?

  29. 29

    要素の関数を継続的に実行する、または終了しないようにするにはどうすればよいですか?

ホットタグ

アーカイブ