-4

我想让一些类继承自列表中父类中定义的一些设置,我不知道如何以一种干净的方式制作它。
让我举个例子:假设我们有彩票玩家,他们有喜欢的数字,比如 NorthFolks 喜欢 3、5、7,而 SouthFolks 更喜欢 12、17 和 21。
现在我想做一个 SuperstisiousNorthFolk,它就像一个 NorthFolk , 但也喜欢 13 和 31。
很明显,我可以将 3、5、7、13、31 定义为其首选数字,但我怎么能继承这些设置呢?
最好的解决方案是允许链式继承,比如定义一个 SatinistSupersitiousNorthFolk,继承 SuperstitiousNorthFolk,也希望 666。

关于这个问题:我尝试了什么:只有那些没有编译,或者没有工作,或者很丑陋的东西。

编辑:我不是使用这些类的人,我想让它们以一种对用户透明的方式工作,并且看起来完全一样,带有一个 pref 属性,它可以是公共的或私有的,我'我还不清楚这一点。

像(!我知道这行不通!)

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

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

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

所以也许我可以使用一个实际上意味着“添加这些元素”的设置器,以及一个可以将它们全部包含在内的获取器,包括所有继承的......正如我所说,还不清楚解决方案(否则我猜我不会问这样的!! :-) )

编辑2:我认为这是不可能的,但万一有人看到它不是:我希望它以混合方式工作,就像我可以用迷信和撒旦教徒扩展 SouthPeople 以获得具有 12、17、21、13 的课程, 31 和 666 作为首选数字。

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

4

2 回答 2

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);
}
于 2013-11-09T18:28:22.370 回答
1

如果您可以使用Iterables 而不是列表,那么通过将子类列表与超类列表链接起来很容易做到这一点。

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

于 2013-11-09T22:16:31.397 回答