-4

リスト内の親クラスで定義されたいくつかの設定からいくつかのクラスを継承させたいのですが、それをきれいな方法で作成する方法がわかりません。
例を挙げてみましょう: 宝くじのプレイヤーがいて、NorthFolks は 3、5、7 が好きで、SouthFolks は 12、17、21 が好きなように、好きな数字があると想像して
ください。 、しかし13と31も好きです。
したがって、明らかに、3、5、7、13、31 を優先数値として定義することもできますが、これらの設定を継承するにはどうすればよいでしょうか?
最良の解決策は、継承を連鎖させて、たとえば、666 も必要とする SuperstitiousNorthFolk を継承する SatanistSupersitiousNorthFolk を定義できるようにすることです。

質問について:私は何を試しましたか:コンパイルされなかったか、機能しなかったか、またはかなり醜いものだけ。

編集:私はクラスを使用していません。ユーザーにとって非常に透過的な方法でそれらを機能させたいと思います。パブリックまたはプライベートの優先プロパティを使用して、まったく同じように見えます。これについてはまだはっきりしていません。

のようなもの (!これが機能しないことはわかっています!)

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

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

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

したがって、実際には「これらの要素を追加する」ことを意味するセッターと、継承されたすべての要素を含むすべてを提供するゲッターを使用できます...私が言ったように、解決策についてはまだ明確ではありません(そうでなければ、私は推測しますSOで尋ねません!! :-) )

EDIT 2:それは不可能だと思いますが、誰かがそれを見ていない場合:12、17、21、13を持つクラスを取得するためにSouthPeopleを迷信とSatanistで拡張できるように、ミックスインの方法で機能することが好きです、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

Iterableリストではなく sを使用できる場合は、サブクラス リストをスーパークラス リストと連鎖させることで、これを非常に簡単に行うことができます。

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 に答える