![](/img/trans.png)
[英]How to call a non abstract method of an abstract class directly without deriving the abstract class?
[英]Difference in deriving from abstract and non abstract class
在OOP中,我看到很多类派生自父类,但父类没有标记为抽象类。 当类IS被标记为抽象时,它提供了什么优势?
谢谢
差异非常实用:抽象基类是从不打算实例化的基类,因此不必提供完整的实现。 这意味着ABC可以在不实现类的情况下为派生类定义合约 。
这有两种方便:
您可以定义没有完整实现但是对整个类进行断言的抽象对象。 这方面的一个例子是让DrawItem类具有draw()
方法,该方法是Circle,Rectangle等的基类。 DrawItem 不知道如何绘制自己,因为它不知道它是什么。
您可以定义可以具有两个具体实现的类。 这显示在代理模式中,也可用于构建例如用于测试的模拟对象。
现在,新语言为这些东西定义接口或模块或混合更为常见; 事实证明,使用ABC几乎总是属于那些更直观的概念的用例。
Paul Haahr 提出了有趣的建议 ,例如:
不要具体类的子类
(阅读原文,我不想复制和粘贴一切;-)。
Paul写了关于Java的文章,但我发现至少他的这部分建议适用于大多数OO设计任务(虽然实际上我仍然偶尔会在编码时偏离它,它在我的设计中很活跃;-),即使我在我将用C ++,Python或其他方式实现它。 如果在阅读保罗的推理后,你发现自己同意他的意思,那么你将来会使用更多抽象的类(允许子类化;-)。
调用类“抽象”本质上是为了向你的程序员传达它不完整的东西:他们需要编写更多的代码才能使用它。
实际上,在函数式编程中部分应用了函数并行...
抽象类不能自己实例化; 它必须来源于实例化。 本质上,类的抽象定义表明它不是要实例化为自身,获取它的实例的唯一方法是从该类继承,并实例化继承的类。
编译器不允许你实例化它的事实?
举一个我认为相关的例子:
public abstract class CustomSocket()
{
CustomSocket()
{
}
public abstract void PleaseOverideMe(CustomSocketConnection c)
{
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.