我想让一些类继承自列表中父类中定义的一些设置,而我不知道如何以干净的方式进行创建。
让我举一个例子:想象一下,我们有彩票玩家,他们有喜欢的数字,比如NorthFolks喜欢3,5,7,其中SouthFolks更喜欢12,17和21。
现在我想制作一个SuperstisiousNorthFolk,它就像一个NorthFolk,但也喜欢13和31。
显然,我可以将3,5,7,13,31定义为首选数字,但我怎样才能继承这些设置?
最好的解决方案是允许链接继承,定义一个SatanistSupersitiousNorthFolk,继承SuperstitiousNorthFolk,也希望666。
关于这个问题:我尝试了什么:只有那些无法编译或无法工作或非常难看的东西。
编辑: 我不是那些使用这些课程的人,我希望让他们以透明的方式为他们的用户工作,并且看起来完全相同,使用pref属性,这将是公共或私人的,我是还不清楚这个。
像(!我知道这不起作用!)
Class NorthFolks {
List<int> prefs = [3, 5, 7 ];
}
和
Class SuperstitousNorthFolks {
List<int> prefs = [13, 31] ;
}
和
Class SatanistSuperstitousNorthFolks {
List<int> prefs = [666] ;
}
所以也许我可以使用一个意味着,实际上是'添加那些元素'的一个setter,以及一个可以全部给它们的getter,包括所有继承的......正如我所说,还没有明确解决方案(否则我想我不会问SO !! :-))
编辑2:我认为这是不可能的,但万一有人看不到:我可以认为它以混合的方式运作,就像我可以用迷信和撒旦主义者扩展南方人来获得12,17的班级, 21,13,31和666作为首选数字。
Rq:我想尽可能避免使用镜像,因为截至目前它们不兼容js。
答案 0 :(得分:1)
这样的东西?
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);
}
答案 1 :(得分:1)
如果你可以使用Iterable
而不是列表,那么通过将子类列表与超类列表链接起来很容易做到。
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()
返回一个延迟评估的Iterable,因此您可以改变底层集合并将新值反映在输出中。