2017-05-31 100 views
0

classconst給出了定義結構化常量的好方法。現在我試圖從一個延伸,工作好。嘗試從繼承類使用常量,它的工作原理,但我只能設法通過final而不是const。在我的項目中沒有什麼大不了的,但它可能有const如何擴展const構造函數

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實例。你還沒有申報過一個,也沒有一點解決辦法就無法直接完成。

的問題是,B延伸A,它不只是包含A實例。所以,如果你想開始與A實例(如A.ONE),並從它創建一個B實例,其中擴展BA都有自己namevalue領域,你必須提取從Anamevalue到創建新的對象......並且你不能在const表達式中進行屬性提取。所以,這是一個不行。

你可以做的是有不同的實現的B直接從A實例都有它的值,然後創建一個常數:

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

太好了,謝謝。對於我的項目而言,''const'不是'final'的關鍵。也嘗試過使用屬性提取,但不適用於'const'構造。 'A.ONE.name'不被解釋爲'const'。 –