带子项的C#类

时间:2015-01-13 13:51:05

标签: c# class subitem

假设我想要一个包含许多子类的主类,子类都具有相同的属性/方法,我需要在许多不同的其他代码部分访问它们。

实施例: 主要类别:国家

子类/项目:德国,荷兰,大不列颠,法国,......

然后为每个国家/地区定义个别属性,例如人口,单位,......

稍后在代码中我可以像

一样访问它
if (Country.France.Units < Country.Germany.Units)
Console.WriteLine("foo");

编辑:感谢大家的答案,CodeCaster的解决方案非常适合我的目的。其他人也是对的,按字符串值解析字典只是不那么重要了......

4 个答案:

答案 0 :(得分:5)

您不想这样做,因为对于每个添加的国家/地区都必须重新编译,这意味着您无法自动将从外部数据源加载的数据链接到静态类型属性。

改为使用字典:

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

// ...

if (countries["France"].Units < ...)

答案 1 :(得分:3)

特别是要解决当前任务,您可以为每个国家/地区创建一个具有私有构造函数和静态属性的类。

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

答案 2 :(得分:1)

您想要的内容与Color结构非常相似。它有一个很大的预定义类,但仍然允许“自定义”颜色。

Color不同,Country具有可能随时间变化的属性,并且可能会因拥有可更新的外部数据源而受益。还有一些国家,所以你可以通过没有数以千计的“法国”实例来优化记忆。

一种适合的模式是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.France看起来比CountryFactory.France
  • 更好

答案 3 :(得分: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);