如何创建并行继承层次结构?

问题描述 投票:0回答:0

假设我有一个继承层次结构。出于演示目的,我将使用 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<Color> 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;
    }
}

现在我想将与动物着色相关的所有数据和方法移动到名为 ColorData 的字段下的单独并行 AnimalData 层次结构(AnimalColorData、CarnivorousAnimalColorData、CatColorData)以符合 SRP。颜色数据将如下所示:

class AnimalColorData
{
    public Color MainColor;

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

class CarnivorousAnimalColorData : AnimalColorData
{
    public List<Color> 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 字段的情况下正确执行此操作?此代码不起作用,因为我将在 Cat 类中拥有 3 个 ColorData 字段副本。我希望能够获取 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

使用泛型类型不是最优的,因为每次我想使用基类时都必须指定类型。

c# unity3d oop
© www.soinside.com 2019 - 2024. All rights reserved.