C# 是否有可能在代码中丢失过度继承?

C# 是否有可能在代码中丢失过度继承?,c#,asp.net,oop,C#,Asp.net,Oop,我目前正在一个asp.net网站上工作,由其他人完成,它的功能极其复杂……我想是的!几乎每个类都继承自另一个类,然后是另一个类,然后是另一个类,等等。。。。。。。你必须平均达到8/10级才能获得基本等级,有时甚至更多!这些类中还有其他类,它们遵循相同的优步继承模式。 这让我在代码中迷失了很多次,最终导致VisualStudio上打开了多少选项卡 这是好的/正常的做法还是坏的做法?我觉得这是一种不好的做法,因为如此简单的事情变得过于复杂,过度使用继承导致无法扩展的代码…………但我可能错了:) 谢谢

我目前正在一个asp.net网站上工作,由其他人完成,它的功能极其复杂……我想是的!几乎每个类都继承自另一个类,然后是另一个类,然后是另一个类,等等。。。。。。。你必须平均达到8/10级才能获得基本等级,有时甚至更多!这些类中还有其他类,它们遵循相同的优步继承模式。 这让我在代码中迷失了很多次,最终导致VisualStudio上打开了多少选项卡

这是好的/正常的做法还是坏的做法?我觉得这是一种不好的做法,因为如此简单的事情变得过于复杂,过度使用继承导致无法扩展的代码…………但我可能错了:)


谢谢

有一个设计指导原则,即“偏好组合而非继承”,8-10级继承在某种程度上打破了这一原则


听起来像是继承过度,很少需要超过2-3个级别,这对于一个复杂的业务模型来说是如此

这些是什么类型的课程?控制?业务对象?它们是否在任何地方被记录(UML),以便您能够很好地了解模型


8-10层的深度太多了,我猜这些类是在设计之前(或从未设计过)编写的。

是的,过度使用继承可能会导致一个意大利面仓库。继承是一种允许封装和抽象的工具。滥用它会导致太多的抽象,然后代码的目的变得不可用。我在命令式构造中也见过这种模式被滥用,在实际应用操作之前,方法从一个方法传递到另一个方法

private bool getData()
{
    return getOtherData();
}

private bool getOtherData()
{
    return getSomeExtraData();
} 

private bool getSomeExtraData()
{
    return SeeHowTediousThisIs();
}

这一切都是可行的,但它只是一个非常糟糕的维护架构。我发现这种情况经常发生在顾问/承包商试图引入复杂性(关于:工作安全性)的情况下。

最肯定的是,我最近一直在挖掘继承的地狱。我们确实有这样的代码

公共A类
“做事情、做方法、做成员等。
作为对象的公共var
公共分新()
成员=新对象
端接头
末级
“是的,它是空的
公共类B:继承A
末级
“是的,它是空的
公共类C:继承
公共分新()
MyBase.New()
member.SomeMethod()
端接头
末级
还有一个基类,它包含一个必须继承的对象列表,以便将对象添加到该列表中


简言之,是的,继承很可能被滥用,就像一切一样。对我最大的帮助是找到一个好的UML建模工具,它可以对您使用的语言进行反向工程。

继承作为重用代码的一种手段确实是一个非常糟糕的选择。考虑到.NET语言中的每个类都有一个<>强>单> /强>继承的槽,其中代码可以去掉。因此,对于每个类,应该明智地选择是否从其他类继承

经典的说法是继承描述了一种“is-a”关系,在这种关系中,通过继承链的上升,我们可以达到更高层次的抽象

第一个问题应该始终是“是否可以充当”关系是不够的。在这种情况下,通过接口描述关系通常是更好的选择。其次,在添加抽象时,问题必须是大量的代码是否能够处理这些抽象,以满足您所寻求的特性

如果几乎没有任何代码使用这些抽象,那么它们本身就很可能一文不值。同样,接口的抽象成本通常低于基类

总之

  • 一段“可以扮演”的关系通常就足够了——这样你就不需要追求“是-是”的关系了
  • 继承槽是宝贵的-它只能使用一次
  • 代码重用的方法比从类继承的方法多得多
  • 基类和接口是抽象的:确保您的代码确实可以使用它们。如果您的接口仅由一个类实现,那么您的抽象可能毫无价值,并且在必要时很容易引入
  • 如果需要抽象,接口的代价比基类的低

另一位建筑宇航员?()是的,这听起来像是非常糟糕的代码,不管听到它有多舒服。现在,也许你想问一个问题,关于如何将它重构成不那么糟糕的东西?文档是否足够所有类使用?它们有像样的命名吗,“顶级”类很容易使用吗?在许多GUI框架中,您可以获得多个级别的继承。只要看看WPF的层次结构,我就可以看到几个类与C#Object有8层之深。@Jimmy:你认为这意味着什么?(提示:这并不意味着8级继承是一个好的设计!)是的,明确地说,sapghetti仓库和类被过度抽象到了不可思议的程度!感谢您的反馈!问题被标记为C#,这就是为什么应用C#语法突出显示。没问题!您可以通过在代码块之前添加HTML注释来指定语言,如