c# - 如何扩展对象层次结构以保存额外数据?

标签 c# oop object

我在具有类层次结构的 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):IAnimalIMammalILion,并在引用这些项目时停止使用类。您现在可以创建丑陋的大组合类,但只能使用 IAnimalIAnimalExtended 引用它,以便只有相关属性可见。更好地使用将不同逻辑功能分组的界面;也许是 ISocial 而不是 IAnimalExtended,其中 ISocial 定义了生物之间的交互方式。

使用组合而不是继承:LionExtended 将公开未在中实现的FeedingSocialNature 的属性一些基础 Animal 类,但在更小的类中,只处理一个问题。

两者兼顾:使用接口(interface)并支持组合而不是继承。

关于c# - 如何扩展对象层次结构以保存额外数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339867/

相关文章:

c# - textarea asp-for 不显示属性

c# - Xamarin Forms 没有为 UITest 设置 StyleId

javascript - 遍历传单 map 层

arrays - 如何在 React 中映射对象数组

Javascript 过滤方法不适用于 if 和 else if

c# - Entity Framework : Dependencies due to foreign key constraints

c# - Xamarin 表单错误 : Java. Lang.NoClassDefFoundError : android. support.graphics.drawable.VectorDrawableCompat

C++ 引用父类(super class)中的子类

c# - 如何对子类隐藏父属性

C++:如何在对象构造期间调用初始化列表之外的成员构造函数?