如何从const构造函数扩展

时间:2017-05-31 07:20:49

标签: dart const

classconst为定义结构化常量提供了很好的可能性。现在我尝试从一个扩展,工作正常。尝试使用继承类中的常量,它可以工作,但我只能通过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!?!

}

1 个答案:

答案 0 :(得分:2)

你的public partial class Startup { public void Configuration(IAppBuilder app) { ... SwaggerConfig.Register(config); } 类确实没有一个构造函数只需要一个B实例。你还没有宣布一个,如果没有一点办法,你就无法直接做到。

问题是A 扩展 B,它不仅包含A个实例。因此,如果您想从A实例(例如A)开始,并从中创建A.ONE实例,其中B扩展B并拥有其拥有Aname字段,您必须从value中提取namevalue以创建新对象...你不能在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构造函数。