繁体   English   中英

从抽象类和非抽象类派生的差异

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM