我想从列表中父类中定义的某些设置继承一些类,我不知道如何以干净的方式制作它。
让我举个例子:想象一下,我们有彩票玩家,他们有偏好的数字,比如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()
返回延迟计算的可迭代对象,因此您可以改变基础集合并将新值反映在输出中。