Как создать параллельную иерархию наследования?C#

Место общения программистов C#
Ответить
Anonymous
 Как создать параллельную иерархию наследования?

Сообщение Anonymous »

Предположим, у меня есть иерархия наследования. В демонстрационных целях я буду использовать C# и иерархию животных:

Код: Выделить всё

abstract class Animal : MonoBehaviour
{
public int Health;

public Color MainColor;

public virtual bool HasColor(Color color)
{
return MainColor == color;
}
}

abstract class CarnivorousAnimal : Animal
{
public int Damage;

public List SecondaryColors;

public override bool HasColor(Color color)
{
return base.HasColor(color) || SecondaryColors.Contains(color);
}
}

class Cat : CarnivorousAnimal
{
public float MeowLoudness;

public Color FurColor;

public override bool HasColor(Color color)
{
return base.HasColor(color) || FurColor == color;
}
}
А теперь я хочу переместить все данные и методы, связанные с окраской животных, в отдельную параллельную иерархию AnimalData (AnimalColorData, CarnivorousAnimalColorData, CatColorData) в полях с именами ColorData в соответствии с рекомендованной розничной ценой. Данные о цвете будут выглядеть следующим образом:

Код: Выделить всё

class AnimalColorData
{
public Color MainColor;

public virtual bool HasColor(Color color)
{
return MainColor == color;
}
}

class CarnivorousAnimalColorData : AnimalColorData
{
public List SecondaryColors;

public override bool HasColor(Color color)
{
return base.HasColor(color) || SecondaryColors.Contains(color);
}
}

class CatColorData : CarnivorousAnimalColorData
{
public Color FurColor;

public override bool HasColor(Color color)
{
return base.HasColor(color) || FurColor == color;
}
}
И результирующая иерархия животных должна выглядеть так:

Код: Выделить всё

abstract class Animal : MonoBehaviour
{
public int Health;
public AnimalColorData ColorData;
}

abstract class CarnivorousAnimal : Animal
{
public int Damage;
public CarnivorousAnimalColorData ColorData;
}

class Cat : CarnivorousAnimal
{
public float MeowLoudness;
public CatColorData ColorData;
}
Как мне это сделать правильно, не скрывая базовые поля ColorData? Этот код не будет работать, поскольку у меня будет 3 копии поля ColorData в классе Cat. Я хочу иметь возможность взять любой экземпляр Cat и получить данные о его цвете следующим образом:

Код: Выделить всё

Cat cat = new Cat();
cat.ColorData.MainColor = Color.green;
cat.ColorData.FurColor = Color.cyan;

CarnivorousAnimal animal = cat;
Console.WriteLine(animal.ColorData.HasColor(Color.cyan)); //false

Console.WriteLine(cat.ColorData.HasColor(Color.cyan)); //true
Использование универсальных типов было бы неоптимальным, поскольку мне придется указывать тип каждый раз, когда я хочу использовать базовый класс.

Подробнее здесь: https://stackoverflow.com/questions/760 ... -hierarchy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»