关于C#:当我们可以继承普通类时,为什么我们需要抽象类?

Why we need abstract class when we can inherit normal class?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Interface vs Abstract Class (general OO)

下面是我在接口类、抽象类和普通类之间的混淆-

  • 我知道抽象类可以有一个不带实现的方法,但是在基类中将方法声明为虚拟的、带有一些虚拟实现的、在派生类中过度使用的方法有什么坏处呢?寻找一个可以验证答案的实际场景?

  • 当我们有抽象类的时候,为什么我们需要一个接口,我知道通过接口我们可以有多重继承,并且已经研究了各种理论原因,寻找抽象类只是帮不上忙的实际场景,而你必须去寻找接口?

  • 拥有抽象类和接口不是开销吗?


  • 实际的例子

    我认为你的思维太硬。ITS样看一个叉和勺和担心的是,当使用时。没有正确的答案,只是使用一个理解你是什么你做的。一个多路径的特别关注。

    这里是我使用的基础知识,在现实世界中(财富500强公司等……)

    接口允许你添加在你想为一类。他们不允许你绑定到任何你想要的一样多的合同。他们是你得到的是最小的。在这个例子中我使用的是一个音乐编码器服务它只是一些简单的属性和方法的类型,每个编码器的需要。我将添加更多的是为其他的需求和接口的即插即用,但我不想打破代码的其他部件不需要了解或关心新的接口。的酒店,干净的编码和松散的耦合可以有超过一个这样的合同制造我的镰刀。主界面是件事,当你使用他们,不要让他们defeats变为它的目的而组成的一个接口,一个新的。接口类型是最好的插件开发。

    抽象类是小,因为你可以有一些很酷的实施已经有像基地,但你不说,"但你必须让这个安静的部分,作为ITS的实施这类的责任。这可能是一个"保存"的方法的例子。让我们说你有一些抽象数据类是在处理相同的方式,但你有许多commonalities优先摘要舱是在做很多工作,但你有一个要求,每个继承型保存自己的数据格式,例如,在其自己的需要。这是一个从网络项目在Facebook和Twitter的或保存的东西是另一个项目中的东西保存的数据库和文件系统的核心代码,但总是被说这是中央数据库保存和加载日期修改。

    对不起,我是无聊的,有很多的打字。但这是我已经使用他们。


  • 在的情况下有没有"正确"的虚拟实现。在System.IO.Stream(抽象类)的实例,例如,什么是合理的执行ReadWritefor a?掷?做什么?许多方法或在System.Xml.XmlReader类怎么实现一个合理的DepthA,或在Read任意XML阅读器?制作方法:A类(不是虚拟)摘要作者的阶级,是制作一个语句必须是类的测定从的人,为那些想要做什么的方法,和一enforces摘要预选赛。

  • 具体的原因,正是你所说的多重继承。如果在IEnumerable是抽象类,例如,有很多情况下我们会想可以在使用enumerate对象元素,但不能因为已经从一些其他的类继承的对象。理论上的原因更是接口通常定义在类定义的行为,一个对象的集群,但暴露的问题和具体的原因是更多的,好的,实用的。

  • 我不明白你的问题。架空和义?


  • 每个人都有自己的目的。当您不想定义任何特定的实现时,可以使用接口。它只提供对象的"接口",即构成公共定义的方法和属性。一个对象可以继承多个接口。一个很好的例子是List<>对象。List<>实现了多个接口,如IEnumerableIListICollectionIEnumerable<>IList<>ICollection<>

    每种方法都有不同的方法和属性,并且用于不同的目的。你不能用抽象类来做这个。您可以将List<>强制转换到这些接口中的任何一个,并在不知道它们的确切实现的情况下使用它们。这对于一个称为依赖注入的概念特别有用,但还有许多其他用途。

    当您希望定义对象实现的一部分,但希望将其他部分留给派生类时,抽象类很有用。关于抽象类,需要记住的一个关键点是,它们不能自己实例化,因为它们通常缺乏完整的实现,而且抽象关键字告诉编译器它不能被实例化。是的,您可以提供虚拟实现,但为什么?关键是摘要是……好。。摘要。

    假设你有一个类猫,这个类来自一个类动物。没有动物物体,它只是一种"类型"。你不能实例化一个动物,因为现实世界中没有真正的动物,只有动物才是动物类型。你可以把不同的生物视为一种常见的动物类型,但不可能存在真正的动物,这只是一个概念。

    动物是一种抽象的类型,因为动物的概念是抽象的。软件也是如此。您可能有对象的概念,例如流。它是网络流吗?文件流?记忆流?流只是一个概念。接口也是一个概念,但与抽象类不同,接口不能有任何实现。

    因此,将抽象类看作是一个有一些实现的概念,而接口则是一个没有任何实现的概念。