为什么喜欢构图而不是继承呢?每种方法都有哪些权衡取舍?什么时候应该选择继承而不是作文?
我听说Liskov替换原则(LSP)是面向对象设计的基本原则.它是什么以及它的使用例子是什么?
oop liskov-substitution-principle definition design-principles solid-principles
最近我在求职面试时被问到这个问题,我无法回答.那么,java.io中最常用的模式是什么?它是如何使用的?常见的Java库中使用的其他模式有哪些?
我听说它说"设计继承"是"困难的",但我从来没有发现过这种情况.任何人(以及任何人,我的意思是Jon Skeet)都可以解释为什么这可能是困难的,陷阱/障碍/问题是什么,为什么凡人的程序员不应该尝试它,只是让他们的课程密封以保护无辜者?
好吧,我嘲笑后者 - 但我很想知道是否有人(包括Jon)真的遇到"继承设计"的困难.我真的从来没有把它视为一个问题,但也许我忽略了一些我认为理所当然的东西 - 或者在没有意识到的情况下搞砸了什么!
编辑:感谢到目前为止所有优秀的答案.我相信共识是,对于典型的应用程序类(WinForm子类,一次性实用程序类等),不需要考虑任何类型的重用,更不用说通过继承重用了,而对于库类,考虑重用是至关重要的.通过设计中的继承.
我并没有真的想到一个WinForm类来实现一个GUI对话框,作为一个有人可能会重用的类 - 我有点认为它是一个一次性的对象.但从技术上讲,它是一个类,有人可能会继承它 - 但它不太可能.
很多大规模的发展,我所做的一直是基础库和框架类库,因此设计为通过继承的重用是至关重要的-我只是从来没有认为这是"难",它只是为.;-)
但我也从未考虑过与WinForms等常见应用任务的"一次性"类别相比.
当然,欢迎设计继承的更多提示和陷阱; 我也试着投入一些.
在许多描述虚拟基类(通常用于解决钻石问题)的教程中,它们通常都有类似于此结构设计的代码:
class Animal
{
public:
Animal()
{
cout << "Creating Animal\n";
}
};
///////////////////////////
class FourLegs : virtual public Animal
{
public:
FourLegs()
{
cout << "Creating FourLegs\n";
}
};
///////////////////////////
class Mammal : virtual public Animal
{
public:
Mammal()
{
cout << "Creating Mammal\n";
}
};
///////////////////////////
class Fox : public FourLegs, public Mammal
{
public:
Fox()
{
cout << "Creating Fox\n";
}
};
Run Code Online (Sandbox Code Playgroud)
当我创建Fox的实例时,我得到了预期的输出,只创建了一个Animal:
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
Run Code Online (Sandbox Code Playgroud)
如您所见,我有两个二级类继承虚拟.现在,如果只有一个二级类被虚拟继承,而另一个只是公开继承,那么就会出现有趣的输出.例如,如果FourLegs是继承的公共和Mammal继承虚拟公共,这是输出:
Creating Animal
Creating …Run Code Online (Sandbox Code Playgroud) 抱歉,如果这没有意义,我不是一个经验丰富的程序员.
请考虑以下代码:
import mymodule
class MyClass:
def __init__(self):
self.classInstance = myModule.classInstance()
Run Code Online (Sandbox Code Playgroud)
然后 ......
from mymodule import classInstance
class MyClass(classInstance):
def __init__(self):
pass
Run Code Online (Sandbox Code Playgroud)
如果我只是想在MyClass中使用一个classInstance,是否可以从模块中导入特定的类并让MyClass继承这个类?
在决定这两种方法时,是否有任何最佳实践或我应该考虑的事项?
非常感谢
inheritance ×4
oop ×3
aggregation ×1
c++ ×1
composition ×1
definition ×1
io ×1
java ×1
liskov-substitution-principle ×1
module ×1
python ×1