2017-05-31 7 views
0

classおよびconstは、構造化定数を定義する良い方法です。今私は1つから拡張しようとすると、大丈夫です。継承されたクラスの定数を使用しようとすると、それでも動作しますが、constの代わりにfinalで処理できます。私のプロジェクトで大したことはありませんが、それは可能でしょうかconstconstコンストラクタからの拡張方法

class A { 
    final String name; 
    final int value; 
    const A(final String this.name, final this.value); 
    static const A ONE = const A('One', 1); 
} 

class B extends A { 

    const B(final String name, final int val) : super(name, val); 

    static const B B_ONE = const B('One', 1);//Ok 
    static const A A_ONE = A.ONE;//Ok 
    static final B BA_ONE = new B(A.ONE.name, A.ONE.value);//Ok 
    static const B BA_ONE_CONST = const B(A.ONE);//No B constructor!?! 

} 

答えて

2

あなたBクラスは確かに単一Aインスタンスを取るコンストラクタを持っていません。あなたは宣言しておらず、少しの回避策なしで直接行うことはできません。

問題はBAを拡張し、それだけでAインスタンスが含まれていないということです。 BAを拡張し、独自のnamevalueフィールドを有している場合ので、あなたはAインスタンスを開始する場合(A.ONEなど)と、それからBインスタンスを作成し、次のことがAからnamevalueを抽出する必要があります新しいオブジェクトを作成し、const式でプロパティ抽出を行うことはできません。だから、それは無駄だ。あなたは何ができるか

Aインスタンスから直接その値を取得しますBの異なる実装を持っているし、そのから定数を作成することです:

class B extends A { 
    const B(String name, int value) : super(name, value); 
    const factory B.fromA(A instance) = _SecretB; 
    ... 
    static const B BA_ONE_CONST = const B.fromA(A.ONE); 
} 
class _SecretB implements B { 
    final A _instance; 
    const _SecretB(this._instance); 
    String get name => _instance.name; 
    int get value => _instance.value; 
} 

あなたはB.fromAを使って一つだけある場合コンストラクタを削除するだけで、_SecretBコンストラクタを直接呼び出すことができます。クラスの他のクライアントに公開したい場合は、こちらのようにconst factoryのコンストラクタにすることができます。

+0

よろしくお願いいたします。私のプロジェクトでは 'final'の代わりに' const'を使うことが重要です。また、プロパティ抽出でそれを試してみましたが、 'const'構築にはうまくいきません。 'A.ONE.name'は' const'として解釈されません。 –

関連する問題