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

时间:2009-06-07 00:50:33

标签: c# oop

在OOP中,我看到很多类派生自父类,但父类没有标记为抽象类。当类IS被标记为抽象时,它提供了什么优势?

由于

6 个答案:

答案 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)
    {

    }

}