1

次のコードを検討してください。

abstract class ClassAbstract {
    static int _someValue = 10;

    ClassAbstract() {}   
  }

  class NormalClass extends ClassAbstract {
    NormalClass(): super() {}

    void RunMe() {
      print("Value from abstract super: $_someValue");  // Error here
    }
  }


  void main() {
    NormalClass normalClass = new NormalClass();
    normalClass.RunMe();
    print("Application close");
  }

これを実行すると、次のエラーが表示されます。

Class 'NormalClass' has no instance getter '_someValue@0x213da713'.

NoSuchMethodError : method not found: '_someValue@0x213da713'
Receiver: Instance of 'NormalClass'
Arguments: []

ここで間違っているかもしれませんが、グローバルな静的変数は継承する必要がありますが、この例からわかるように、そうではありません...

4

1 に答える 1

2

実際、Dart では静的メンバーは継承されません。宣言クラスの外でそれらにアクセスしたい場合は、常にクラス名でアクセスを修飾する必要があります。

あなたの場合:

class NormalClass extends ClassAbstract {
  void runMe() {
    print("Value from abstract super: ${ClassAbstract._someValue}");
  }
}

仕様には、7.7 章 (非規範的な部分) でこれについていくつかの言葉があります。

静的メソッドの継承は、Dart ではほとんど役に立ちません。静的メソッドはオーバーライドできません。必要な静的関数は宣言ライブラリから取得でき、継承によってスコープに入れる必要はありません。経験上、開発者はインスタンス メソッドではない継承されたメソッドの概念に混乱しています。

もちろん、静的メソッドの概念全体については議論の余地がありますが、非常に多くのプログラマーがそれに精通しているため、ここでは保持します。Dart の静的メソッドは、囲んでいるライブラリの関数と見なすことができます。

于 2013-04-07T08:47:01.560 に答える