2017-05-31 102 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'。 –