使用继承作为重用代码的一种方式有什么缺点?使用继承作为重用代码的一种方式有什么缺点?
回答
使用继承实现代码重用从具有以下问题:
你不能在运行时改变重用行为。继承是编译时依赖性,因此,如果一个
GameClient
类从TCPSocket
继承重用connect()
和write()
成员函数,它具有TCP功能的硬编码。你不能在运行时改变它。不能取代来自外部的重复使用性能进行测试的缘故。如果一个
GameClient
类继承自TCPSocket
,以至于得到write()
(用于将数据写入套接字),则不能从外部交换此代码。你不能插入一个不同的write()函数来记录所有要写入文件的数据。你是依赖于所有,但最简单的应用多重继承。这为diamond shaped inheritance trees打开了大门,这会增加代码复杂度。
喜欢使用继承的组合来重用代码可以避免所有这些问题。
它需要继承(用于反射它),这是仅适用于代码许多可能的结构中的一种。这就是为什么我们有程序编程,函数式编程,面向对象编程,面向方面编程,声明式编程等。请参阅programming paradigms。
IIRC,所述里氏替换原则1)假定,一个人应该能够通过任何其派生类的替代的类;也就是说,派生类不应该表现出与它们的基类所建立的契约完全不同的行为,或者违反其基类设立的契约。
显然,这个原则对如何(基)类可以被另一个类(从它派生出来)“重用”提出了有意的限制。其他使用类的方法,如聚合或合成,不受原理的限制。
1)参见例如The Liskov Substitution Principle(指向PDF文档的链接)。
使用继承意味着当您在同一个类中调用一个方法(或C++中的虚拟方法)时,您可能实际上正在调用一个子类的方法并不是很清楚。可能导致的代码异味是在类层次结构中上下移动的调用堆栈,这实际上意味着您的超类和子类处于循环依赖状态。
使用组合和接口清楚地表明存在多种可能的实现,并且在存在循环依赖(通常应该被删除)时也很明显。 (由于一些原因(假设您通过构造函数使用类的传递依赖关系),构造使循环依赖显而易见)。如果A和B相互依赖,那么A构造B并且将this
或self
传递给B的构造函数,这是一个循环依赖的明确标志,或者其他一些类构造A和B,A变得不可能,因为A要求B先构建,而B需要先构建A)。
如果使用继承,则会将其绑定到可变状态的面向对象的范例中。如果您尝试使用不可变对象,您最终会写[伪代码]
class A (int X, int Y)
def self.nextX(int nextX) = A(newX, self.Y)
class B (int X, int Y, int Z) extends A(X, Y)
def self.nextX(int nextX) = B(newX, self.Y, self.Z)
并且没有代码重用。因此,你使用可变对象,并发生疯狂:)。
- 1. 是否有某种方式不重复的代码继承类
- 2. 在数据库中使用继承有什么优点和缺点
- 3. 模拟XAML代码继承的最佳方式是什么?
- 4. “继承”属性:它有什么作用?
- 5. 为什么这行代码以这种方式工作?
- 6. 为什么使用Javascript原型继承?
- 7. 为什么用这种方式输出这段代码?
- 8. python类继承代码重用
- 9. 使用Maven有什么优点/缺点?
- 10. 类继承代码不起作用
- 11. 在python为什么超级行为这种方式与多继承?
- 12. 使用AJAX作为RIA有什么缺点吗?
- 13. 使用PHP数据库类作为单例有什么缺点?
- 14. 为什么不继承我认为它应该工作的方式工作?
- 15. 为什么雅虎CSS重置使用“字体:继承”
- 16. 为什么不推荐使用多重继承?
- 17. C++继承 - 为什么我的函数没有被使用?
- 18. 使用translate来代替标点符号,这三种方式有什么区别?
- 19. 如何重用没有多继承的代码?
- 20. Fowler空对象模式:为什么使用继承?
- 21. Java为什么我不能使用具有功能接口的多重继承
- 22. 这个继承的java代码有什么错误?
- 23. 将其中一种异步方法重写为使用承诺的一种
- 24. 使用电子邮件作为用户名有什么优点和缺点?
- 25. 使用android有什么缺点:largeHeap =“true”?
- 26. 使用SOAP服务有什么缺点?
- 27. 使用git-svn有什么优缺点?
- 28. 使用SqlServer视图有什么缺点?
- 29. 使用AVL树有什么缺点?
- 30. 为什么有人会以这种方式使用ob_start,这有什么意义?
是不是在你的教科书的某个地方? – Grumdrig 2010-07-20 21:06:10
当你想从多个类继承功能,但是你的语言不支持多继承时会发生什么? – 2010-07-20 21:11:48
C++支持多种继承 java支持使用接口 不知道其他人 – inglor 2010-07-20 21:13:45