class
和const
为定义结构化常量提供了很好的可能性。现在我尝试从一个扩展,工作正常。尝试使用继承类中的常量,它可以工作,但我只能通过final
而不是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!?!
}
答案 0 :(得分:2)
你的public partial class Startup
{
public void Configuration(IAppBuilder app)
{
...
SwaggerConfig.Register(config);
}
类确实没有一个构造函数只需要一个B
实例。你还没有宣布一个,如果没有一点办法,你就无法直接做到。
问题是A
扩展 B
,它不仅包含A
个实例。因此,如果您想从A
实例(例如A
)开始,并从中创建A.ONE
实例,其中B
扩展B
并拥有其拥有A
和name
字段,您必须从value
中提取name
和value
以创建新对象...你不能在const表达式中进行属性提取。所以,那是不行的。
您可以做的是让A
的不同实现直接从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
构造函数。