继承列表内容

时间:2013-11-09 14:03:06

标签: inheritance dart

我想让一些类继承自列表中父类中定义的一些设置,而我不知道如何以干净的方式进行创建。
  让我举一个例子:想象一下,我们有彩票玩家,他们有喜欢的数字,比如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。

2 个答案:

答案 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而不是列表,那么通过将子类列表与超类列表链接起来很容易做到。

我将使用Quiverconcat()函数

进行演示
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,因此您可以改变底层集合并将新值反映在输出中。