0

たとえば、多くのサブクラスを含むメイン クラスが必要で、サブクラスはすべて同じプロパティ/メソッドを持ち、他のさまざまなコード部分でそれらにアクセスする必要があるとします。

例: メインクラス: 国

サブクラス / アイテム: ドイツ、オランダ、イギリス、フランス、...

次に、人口、単位など、国ごとに個別のプロパティを定義します...

したがって、コードの後半で次のようにアクセスできます

if (Country.France.Units < Country.Germany.Units)
Console.WriteLine("foo");

編集:皆さんの回答に感謝します.CodeCasterのソリューションは私の目的に最適です. 他の人も正しいです。辞書を文字列値で解析するのは簡単です...

4

4 に答える 4

5

これは、国を追加するたびに再コンパイルする必要があり、外部データ ソースから読み込まれたデータを静的に型指定されたプロパティに自動的にリンクすることができないため、実行したくありません。

代わりに辞書を使用してください。

var countries = new Dictionary<string, Country>();

// ...

if (countries["France"].Units < ...)
于 2015-01-13T13:53:05.333 に答える
3

特に現在のタスクを解決するために、国ごとにプライベート コンストラクターと静的プロパティを持つクラス Country を作成できます。

public class Country
{
    private Country()
    {
    }

    public int Population {get; private set;}

    // Static members

    public static Country USA {get; private set;}
    public static Country Italy {get; private set;}

    static Country()
    {
        USA = new Country { Population = 100000 };
        Italy = new Country { Population = 50000 };
    }
}

次のコードでアクセスできます

Country.USA.Population < Country.Italy.Population
于 2015-01-13T14:06:48.180 に答える
1

あなたが望むものは、Color構造体に非常に似ています。あらかじめ定義されたクラスの大規模なセットがありますが、「カスタム」色も使用できます。

とは異なりColor、ただし、Country時間の経過とともに変化する可能性のあるプロパティがあり、更新可能な外部データ ソースを持つことでメリットが得られる場合があります。国の数も限られているため、何千もの「フランス」インスタンスが浮かんでいないことでメモリを最適化できます。

それに合うパターンの 1 つはFlyweightです。ファクトリ メソッドを使用して浮遊するオブジェクトの数を最小限に抑えることができますが、事前に定義された国のセットに簡単にアクセスできます。

public class Country
{
    // properties of a Country:
    public int Population {get; private set;}
    public string Units {get; private set;}
    // etc.

    // Factory method/fields follows

    // storage of created countries
    private static Dictionary<string, Country> _Countries = new Dictionary<string,Country>();

    public static Country GetCountry(string name)
    {
        Country country;
        if(_Countries.TryGetValue(name, out country))
            return country;
        //else
        country = new Country();
        // load data from external source
        _Countries[name] = country;
        return country;
    }

    public static Country France { get {return GetCountry("France");} }
    public static Country Germany { get {return GetCountry("Germany");} }
}

現状の設計に関するいくつかの注意事項:

  • スレッドセーフではありません。適切なスレッド セーフを追加する必要があります。
  • 国は永遠ではありません - 事前定義された国が存在しなくなったらどうしますか?
  • 理想的には、ファクトリは別のクラスにして、クラスをファクトリから切り離すことができますが、より見栄えが良いCountryと思いますCountry.FranceCountryFactory.France
于 2015-01-13T14:33:24.570 に答える
0

辞書の文字列解析が気に入らず、リストが比較的小さい場合は、次のようにすることができます。

List<Country> counties = new List<Country>();
countries.Add(France as Country);
countries.Add(Germany as Country);
...

var France = countries.FirstOrDefault(t => t is France);
于 2015-01-13T13:58:17.323 に答える