C# 是否有可能在代码中丢失过度继承?
我目前正在一个asp.net网站上工作,由其他人完成,它的功能极其复杂……我想是的!几乎每个类都继承自另一个类,然后是另一个类,然后是另一个类,等等。。。。。。。你必须平均达到8/10级才能获得基本等级,有时甚至更多!这些类中还有其他类,它们遵循相同的优步继承模式。 这让我在代码中迷失了很多次,最终导致VisualStudio上打开了多少选项卡 这是好的/正常的做法还是坏的做法?我觉得这是一种不好的做法,因为如此简单的事情变得过于复杂,过度使用继承导致无法扩展的代码…………但我可能错了:)C# 是否有可能在代码中丢失过度继承?,c#,asp.net,oop,C#,Asp.net,Oop,我目前正在一个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”关系,在这种关系中,通过继承链的上升,我们可以达到更高层次的抽象 第一个问题应该始终是“是否可以充当”关系是不够的。在这种情况下,通过接口描述关系通常是更好的选择。其次,在添加抽象时,问题必须是大量的代码是否能够处理这些抽象,以满足您所寻求的特性 如果几乎没有任何代码使用这些抽象,那么它们本身就很可能一文不值。同样,接口的抽象成本通常低于基类 总之
- 一段“可以扮演”的关系通常就足够了——这样你就不需要追求“是-是”的关系了
- 继承槽是宝贵的-它只能使用一次
- 代码重用的方法比从类继承的方法多得多
- 基类和接口是抽象的:确保您的代码确实可以使用它们。如果您的接口仅由一个类实现,那么您的抽象可能毫无价值,并且在必要时很容易引入
- 如果需要抽象,接口的代价比基类的低
。