继承列表内容



我想从列表中父类中定义的某些设置继承一些类,我不知道如何以干净的方式制作它。
让我举个例子:想象一下,我们有彩票玩家,他们有偏好的数字,比如NorthFolks喜欢3,5,7,而SouthFolks更喜欢12,17和21。
现在我想做一个迷信的北民,就像北民,但也喜欢13和31。
所以很明显,我可以只定义 3、5、7、13、31 作为它的首选数字,但我怎么能继承这些设置呢?
最好的解决方案是允许连锁继承,定义,比如说,撒旦主义者SupersitiousNorthFolk,继承迷信NorthFolk,这也想要666。

关于问题:我尝试了什么:只有没有编译,或者不起作用或非常丑陋的东西。

编辑:我不是使用这些类的人,我希望它们以透明的方式为用户工作,并且看起来完全相同,具有 pref 属性,这将是公共的或私有的,我还不清楚这一点。

类似的东西(我知道这行不通!

Class NorthFolks {
  List<int> prefs = [3, 5, 7 ];
}

Class SuperstitousNorthFolks {
   List<int> prefs = [13, 31] ;
}

Class SatanistSuperstitousNorthFolks {
   List<int> prefs = [666] ;
}

所以也许我可以使用一个实际上意味着"添加这些元素"的二传手,以及一个会给它们全部的getter,包括所有继承的......正如我所说,还不清楚解决方案(否则我想我不会问 SO !! :-) )

编辑 2 :我认为这是不可能的,但万一有人看到不是:我喜欢它以混合的方式工作,就像我可以用迷信和撒旦主义者扩展南方人,以获得一个有 12、17、21、13、31 和 666 作为首选数字的班级。

Rq :如果可能的话,我想避免使用镜像,因为到目前为止它们与 js 不兼容。

像这样的东西?

class BaseFolk {
    List<int> _prefs;
    BaseFolk(List<int> chainPrefs) {
        this._prefs = [];
        this._prefs.addAll(chainPrefs);
    }
    void printPrefs() {
        print(this._prefs.toString());
    }
}
class NorthFolk extends BaseFolk {
    NorthFolk([List<int> chainPrefs]) : super([3,5,7]..addAll(chainPrefs!=null ? chainPrefs : []));
}
class SouthFolk extends BaseFolk {
    SouthFolk([List<int> chainPrefs]) : super([12,17,21]..addAll(chainPrefs!=null ? chainPrefs : []));
}
class SuperstisiousNorthFolk extends NorthFolk {
    SuperstisiousNorthFolk([List<int> chainPrefs]) : super([13,31]..addAll(chainPrefs!=null ? chainPrefs : []));
}
class SatanistSupersitiousNorthFolk extends SuperstisiousNorthFolk {
    SatanistSupersitiousNorthFolk([List<int> chainPrefs]) : super([666]..addAll(chainPrefs!=null ? chainPrefs : []));
}
void main() {
    new SuperstisiousNorthFolk().printPrefs();
    new SouthFolk().printPrefs();
    new NorthFolk().printPrefs();
    new SatanistSupersitiousNorthFolk().printPrefs();
}

根据评论编辑

class BaseFolk {
    List<int> _prefs = [];
    get prefs => this._prefs;
    void addPref(int pref) {
        this._prefs.add(pref);
    }
    void addPrefs(List<int> prefs) {
        this._prefs.addAll(prefs);
    }
}
class NorthFolk extends BaseFolk {
    NorthFolk() {
        this.addPrefs([3,5,7]);
    }
}
class SuperstisiousNorthFolk extends NorthFolk {
    SuperstisiousNorthFolk() {
        this.addPrefs([13,31]);
    }
}
void main() {
    print(new SuperstisiousNorthFolk().prefs);
    print(new NorthFolk().prefs);
}

如果您可以使用 Iterable s 而不是列表,通过将子类列表与超类列表链接起来,这很容易实现。

我将使用 Quiver 的 concat() 函数进行演示

import 'package:quiver/iterables.dart' show concat;
Class NorthFolks {
  Iterable<int> get prefs => [3, 5, 7];
}
Class SuperstitousNorthFolks extends NorthFolks {
   Iterable<int> get prefs => concat([super.prefs, [13, 31]]);
}
Class SatanistSuperstitousNorthFolks extends SuperstitousNorthFolks {
   Iterable<int> get prefs = concat([super.prefs, [666]]);
}
main() {
  var folk = new SatanistSuperstitousNorthFolks();
  print(folk.prefs); // [3, 5, 7, 13, 31, 666];
}

如果你需要列表,你必须担心对尝试的突变做什么,所以甚至可能更难定义所需的行为。请注意,concat()返回延迟计算的可迭代对象,因此您可以改变基础集合并将新值反映在输出中。

最新更新