假设我有一个继承层次结构。出于演示目的,我将使用 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
使用泛型类型不是最优的,因为每次我想使用基类时都必须指定类型。