Иерархический дизайн классов - PullRequest
0 голосов
/ 11 января 2011

Давайте рассмотрим, я хочу создать следующую иерархию:

Животное -> Класс (млекопитающее, амфибия, ...) -> Семейство (Felidae, Canidae, ...) -> Виды (кошка,tiger, ...).

каждый подкласс зависит от предыдущего.

Любое предложение о наилучшей методологии создания древовидного класса, подобного этому?

Это просто пример проблемы, с которой я столкнулся, но решение мне очень помогло бы ...

спасибо

Настоящая проблема заключается в следующем:

Я должен проанализировать сообщение следующего типа 0102060800FF.

Во-первых, 01 говорит мне, что у меня есть определенный тип сообщения.Учитывая этот тип, я должен искать значение 02 в конкретной таблице и т. Д. ...

Я хочу, чтобы возможные значения подчиненной иерархии фильтровались по ее родителю.Я не уверен, что я достаточно ясен.

спасибо

Ответы [ 2 ]

1 голос
/ 11 января 2011

В наши дни отдавайте предпочтение композиции, а не наследованию.Вот пример - нужна дополнительная логическая проверка, чтобы убедиться, что вы добавляете в правильную иерархию и т. Д.

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;
        }
    }
}
1 голос
/ 11 января 2011

Каждый класс вплоть до настоящего животного является абстрактным классом.Tiger - это конкретный класс, унаследованный от абстрактного класса Felidae, от абстрактного класса Mammalia и т. Д.

Если вы хотите по-настоящему модно, вы можете использовать интерфейсы, такие как IPredator, IWarmBlooded;определите их как возможности.

...