分层类设计

时间:2011-01-11 17:05:53

标签: c# class-design

让我们考虑创建以下层次结构:

动物 - >类(哺乳动物,两栖动物......) - >家庭(猫科,犬科,......) - >物种(猫,虎,......)。

每个子类都依赖于前一个。

有关创建类似于此类的树状类的最佳方法的任何建议吗?

这只是我手头的问题的一个例子,但解决方案对我有很大的帮助......

感谢

真正的问题是:

我必须解析以下类型的消息0102060800FF。

首先,01告诉我我有一种特定类型的消息。 鉴于该类型,我必须在特定表中查找值02,依此类推......

我希望子层次结构的可能值由其父级过滤。我不确定我是否足够清楚。

感谢

2 个答案:

答案 0 :(得分:1)

每个课程都属于实际的动物,是一个抽象的课程。 Tiger是一个具体的类,它继承自抽象类Felidae,来自抽象类Mammalia等。

如果你想变得非常花哨,你可以使用接口,如IPredator,IWarmBlooded;将它们定义为能力。

答案 1 :(得分:1)

这些天,赞成合成而不是继承。这是一个示例 - 需要更多的逻辑检查以确保您添加到适当的层次结构等。

public class Class
{
    private readonly IList<Animal> animals = new List<Animal>();

    public IEnumerable<Animal> Animals
    {
        get
        {
            return this.animals;
        }
    }

    public void AddAnimal(Animal animal)
    {
        if (animal == null)
        {
            throw new ArgumentNullException("animal");
        }

        this.animals.Add(animal);
    }

    //// etc.
}

public class Family
{
    private readonly IList<Animal> animals = new List<Animal>();

    public IEnumerable<Animal> Animals
    {
        get
        {
            return this.animals;
        }
    }

    public void AddAnimal(Animal animal)
    {
        if (animal == null)
        {
            throw new ArgumentNullException("animal");
        }

        this.animals.Add(animal);
    }

    //// etc.
}

public class Species
{
    private readonly IList<Animal> animals = new List<Animal>();

    public IEnumerable<Animal> Animals
    {
        get
        {
            return this.animals;
        }
    }

    public void AddAnimal(Animal animal)
    {
        if (animal == null)
        {
            throw new ArgumentNullException("animal");
        }

        this.animals.Add(animal);
    }

    //// etc.
}

public class Animal
{
    private readonly Class @class;
    private readonly Family family;
    private readonly Species species;

    public Animal(Class @class, Family family, Species species)
    {
        if (@class == null)
        {
            throw new ArgumentNullException("@class");
        }

        if (family == null)
        {
            throw new ArgumentNullException("family");
        }

        if (species == null)
        {
            throw new ArgumentNullException("species");
        }

        this.@class = @class;
        this.family = family;
        this.species = species;
        this.@class.AddAnimal(this);
        this.family.AddAnimal(this);
        this.species.AddAnimal(this);
    }

    public Class Class
    {
        get
        {
            return this.@class;
        }
    }


    public Family Family
    {
        get
        {
            return this.family;
        }
    }


    public Species Species
    {
        get
        {
            return this.species;
        }
    }
}