如何扩展const构造函数
问题描述:
class
和const
给出了定义结构化常量的好方法。现在我试图从一个延伸,工作好。尝试从继承类使用常量,它的工作原理,但我只能设法通过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!?!
}
答
你B
类确实没有一个构造函数一个A
实例。你还没有申报过一个,也没有一点解决办法就无法直接完成。
的问题是,B
延伸A
,它不只是包含A
实例。所以,如果你想开始与A
实例(如A.ONE
),并从它创建一个B
实例,其中扩展B
和A
都有自己name
和value
领域,你必须提取从A
的name
和value
到创建新的对象......并且你不能在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
构造函数。
太好了,谢谢。对于我的项目而言,''const'不是'final'的关键。也尝试过使用属性提取,但不适用于'const'构造。 'A.ONE.name'不被解释为'const'。 –