在OOP中,我看到很多类派生自父类,但父类没有标记为抽象类。当类IS被标记为抽象时,它提供了什么优势?
由于
答案 0 :(得分:2)
差别非常实用:抽象基类是一个从不打算实例化的基类,因此不必提供完整的实现。这意味着ABC可以为派生类定义契约而无需实现类。
这在两个方面很方便:
您可以定义没有完整实现但是对整个类进行断言的抽象对象。这方面的一个示例是使用具有draw()
方法的DrawItem类,该方法是Circle,Rectangle等的基类。 DrawItem 不能知道如何绘制自己,因为它不知道是是什么。
您可以定义可以有两个具体实现的类。这显示在代理模式中,也可用于构建模拟对象以进行测试。
现在,新语言为这些事情定义 interfaces 或 modules 或 mixins 更为常见;事实证明,使用ABC几乎总是属于那些更直观概念的用例。
答案 1 :(得分:1)
Paul Haahr有interesting suggestions,例如:
不要对具体类进行子类化
(阅读原文,我不想复制并粘贴所有内容; - )。
Paul写了关于Java的文章,但我发现至少他的这部分建议适用于大多数OO设计任务(虽然实际上我仍然偶尔会在编码中偏离它,但它还活着并且很好用我的设计 ;-),即使我要用C ++,Python或其他方式实现它。如果在阅读了Paul的推理之后,你发现自己同意了他,那么你将来会使用更多的抽象类(允许子类化; - )。
答案 2 :(得分:1)
调用类“抽象”本质上是为了向你的程序员传达它不完整的东西:他们需要编写更多的代码才能使用它。
实际上,在函数式编程中部分应用了函数并行...
答案 3 :(得分:0)
抽象类不能自己实例化;它必须来源于实例化。本质上,类的抽象定义表明它不是要实例化为自身,获取它的实例的唯一方法是从该类继承,并实例化继承的类。
答案 4 :(得分:0)
编译器不允许你实例化它的事实?
答案 5 :(得分:0)
举一个我认为相关的例子:
public abstract class CustomSocket()
{
CustomSocket()
{
}
public abstract void PleaseOverideMe(CustomSocketConnection c)
{
}
}