我在具有类层次结构的 C# 代码库中工作:
class Animal { Animal prey; }
class Mammal : Animal { Mammal[] livesAmicablyWith; }
class Lion : Mammal { }
原谅这个愚蠢的例子。
我想将此类层次结构重新用于以完全相同的对象格式表示的东西,但这需要更多数据。在我的理想世界中,它看起来像这样:
class Animal { Animal prey; string moreAnimalData; }
class Mammal : Animal { Mammal[] livesAmicablyWith; string moreMammalData; }
class Lion : Mammal { string moreLionData; }
但是,我想避免将成员添加到这个现有的层次结构中,因为它们往好里说是浪费空间,往坏里说是容易出错的干扰。
此外,我需要所有原始功能才能继续工作!这是我的想法:
class AnimalExtended : Animal { }
class MammalExtended : Mammal {
public void UseLivesAmicablyWith()
{
foreach(Mammal m in livesAmicablyWith)
{
if(!(m is MammalExtended)
throw new Exception();
// use the MammalExtended
}
}
}
class LionExtended : Lion { }
这里有什么建议吗?
最佳答案
本质上,您要处理的是多重继承,这在 C# 中当然是做不到的(请参阅 Stackoverflow 上关于此的大量 Q)。
您的选择包括:-
移至接口(interface):IAnimal
、IMammal
、ILion
,并在引用这些项目时停止使用类。您现在可以创建丑陋的大组合类,但只能使用 IAnimal
或 IAnimalExtended
引用它,以便只有相关属性可见。更好地使用将不同逻辑功能分组的界面;也许是 ISocial
而不是 IAnimalExtended
,其中 ISocial
定义了生物之间的交互方式。
使用组合而不是继承:LionExtended
将公开未在中实现的Feeding
和SocialNature
的属性一些基础 Animal
类,但在更小的类中,只处理一个问题。
两者兼顾:使用接口(interface)并支持组合而不是继承。
关于c# - 如何扩展对象层次结构以保存额外数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339867/