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

C# 当我们可以继承普通类时,为什么我们需要抽象类?,c#,oop,C#,Oop,可能重复: 下面是我对接口、抽象类和普通类的混淆- 我知道一个抽象类可以有一个没有实现的方法,但是在基类中声明方法为虚方法,并在派生类中声明虚方法有什么害处呢。寻找一个可以验证答案的实际场景 为什么我们需要一个接口当我们有抽象类的时候,我知道有了接口我们可以有多重继承,并且一直在寻找各种理论上的原因,寻找一些实际的场景,在这些场景中抽象类帮不上忙,而你不得不选择接口 拥有一个抽象类和接口不是开销吗 有些场景中没有“正确”的虚拟实现。例如,在System.IO.Stream案例(抽象类)中,Re

可能重复:

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

  • 我知道一个抽象类可以有一个没有实现的方法,但是在基类中声明方法为虚方法,并在派生类中声明虚方法有什么害处呢。寻找一个可以验证答案的实际场景

  • 为什么我们需要一个接口当我们有抽象类的时候,我知道有了接口我们可以有多重继承,并且一直在寻找各种理论上的原因,寻找一些实际的场景,在这些场景中抽象类帮不上忙,而你不得不选择接口

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

  • 有些场景中没有“正确”的虚拟实现。例如,在
    System.IO.Stream
    案例(抽象类)中,
    Read
    Write
    的合理实现是什么?扔?什么也不做?或者
    System.Xml.XmlReader
    类中的许多方法-对于任意Xml读取器的
    深度
    读取
    来说,什么是合理的实现?通过使类中的方法抽象(而非虚拟),该类的作者声明,从该类派生的任何人都必须考虑如何处理这些方法,抽象限定符强制执行这一点

  • 实际原因正是你所说的——多重继承。例如,如果
    IEnumerable
    是一个抽象类,那么在许多情况下,我们希望能够枚举对象的元素,但无法枚举,因为对象已经从其他类继承。更为理论化的原因是接口通常定义行为,而类定义对象集群,但就您的问题而言,实际原因更为实际

  • 我不明白你的问题。在何种意义上是间接费用

  • 实例 我觉得你想得太多了。这就像看着叉子和勺子,担心什么时候用。没有正确的答案,只是用一个对你所做的事情有意义的答案。有很多途径可以到达那里

    以下是我在现实世界中如何使用这些工具(财富500强公司等)

    接口允许您向类添加任意数量的接口。它们本质上允许你尽可能多地约束任何合同。它们尽可能的小。我在其中使用的一个例子是一个音乐编码器服务,它只有一些简单的属性和方法,每个编码器类型都需要这些属性和方法。后来,随着其他需求的出现,我添加了更多接口,但我不想破坏不需要了解或关心新接口的其他部分的代码。编码器是非常松散耦合的,可以有多个合同,所以这对我来说是有意义的。关于接口的主要问题是,当您使用它们时,不要不断更改它们,因为这会破坏接口的用途,而应该创建一个新的接口。接口是插件类型开发的最佳选择

    抽象类有点酷,因为您可以在其中制作一些基本实现,但实际上您是在说“但是您仍然必须制作这部分”,因为实现这一部分是类的责任。例如,这可能是一个“save”方法。假设您有一个抽象类,它以相同的方式处理数据,但在底层抽象类中有许多共同点,这些共同点做了大量工作,但您有一个要求,即每个继承类型都以自己需要的格式保存自己的数据。这可能涉及到一个在facebook和twitter上保存东西的网络项目,或者另一个在数据库和文件系统中保存东西的项目,但核心代码总是会打到中央数据库,说它是在修改最后日期后保存的


    很抱歉,我很无聊,打字太多了。但我就是这样使用它们的。

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

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

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

    假设你有一个类别猫,这个类别源于一个类别动物。没有动物物体这样的东西,它只是一种“类型”。你不能实例化一个动物,因为现实世界中没有真实的动物,只有动物类型的生物。您可以将不同的生物视为一种常见的动物类型,但