访问字段,即使它被覆盖

时间:2014-06-13 12:54:11

标签: dart

abstract class Base {

  Base() {
    loadDefaults();
  }

  Base.uninitialized();

  void loadDefaults() {}

  Map _values = {};

  operator [](String key) => _values[key];
}

class A extends Base {
  A() : super();

  A.uninitialized() : super.uninitialized();

  @override
  void loadDefaults() {
    _values.addAll(_defaults); // <=== loads g, h, i j instead of a, b, c, d ====|
    super.loadDefaults();
  }

  Map _defaults = {'a':'aVal', 'b': 'bVal', 'c': 'cVal', 'd': 'dVal'};
}

class B extends A {
  B() : super();

  B.uninitialized() : super.uninitialized();

  @override
  void loadDefaults() {
    _values.addAll(_defaults);
    super.loadDefaults();
  }

  Map _defaults = {'g': 'gVal', 'h': 'hVal', 'i': 'iVal', 'j': 'jVal'};
}

void main(args) {
  B settings = new B();

  print(settings['b']); // should print 'bVal'
  print(settings['g']); // prints 'gVal'
}

当我在自己的库中移动每个类时,子类的字段_defaults不再可见,并且它可以根据需要工作。 (我必须将operator []和字段_v添加到每个类中以使其工作,但在此用例中这很好)

当覆盖当前类并且子类位于同一个库中时,有没有办法访问当前类中的字段?

1 个答案:

答案 0 :(得分:2)

这可以检索属性内容,因为您可以调用重写方法。 但它只能从超级&#39;例如,因为在这个&#39;一切都被取代了。

所以在你的情况下,我已经用父_default attr替换了新的_default attr。

我不知道它对你来说是否足够,但它可以按照你的需要运作。

class B extends A {
  B() : super();

  B.uninitialized() : super.uninitialized();

  @override
  void loadDefaults() {
    _values.addAll(this._defaults);
    this._defaults = super._defaults;
    super.loadDefaults();
  }

  Map _defaults = {'g': 'gVal', 'h': 'hVal', 'i': 'iVal', 'j': 'jVal'};
}