C# 当我们可以继承普通类时,为什么我们需要抽象类?
可能重复:C# 当我们可以继承普通类时,为什么我们需要抽象类?,c#,oop,C#,Oop,可能重复: 下面是我对接口、抽象类和普通类的混淆- 我知道一个抽象类可以有一个没有实现的方法,但是在基类中声明方法为虚方法,并在派生类中声明虚方法有什么害处呢。寻找一个可以验证答案的实际场景 为什么我们需要一个接口当我们有抽象类的时候,我知道有了接口我们可以有多重继承,并且一直在寻找各种理论上的原因,寻找一些实际的场景,在这些场景中抽象类帮不上忙,而你不得不选择接口 拥有一个抽象类和接口不是开销吗 有些场景中没有“正确”的虚拟实现。例如,在System.IO.Stream案例(抽象类)中,Re
下面是我对接口、抽象类和普通类的混淆-
System.IO.Stream
案例(抽象类)中,Read
或Write
的合理实现是什么?扔?什么也不做?或者System.Xml.XmlReader
类中的许多方法-对于任意Xml读取器的深度
或读取
来说,什么是合理的实现?通过使类中的方法抽象(而非虚拟),该类的作者声明,从该类派生的任何人都必须考虑如何处理这些方法,抽象限定符强制执行这一点IEnumerable
是一个抽象类,那么在许多情况下,我们希望能够枚举对象的元素,但无法枚举,因为对象已经从其他类继承。更为理论化的原因是接口通常定义行为,而类定义对象集群,但就您的问题而言,实际原因更为实际很抱歉,我很无聊,打字太多了。但我就是这样使用它们的。每一个都有自己的目的。当您不想定义任何特定的实现时,可以使用接口。它只提供对象的“接口”,即构成公共定义的方法和属性。一个对象可以继承多个接口。一个很好的例子是
列表
对象<代码>列表实现了几个接口,如IEnumerable
,IList
,ICollection
,IEnumerable
,IList
和ICollection
每种方法都有不同的方法和不同的属性,用于不同的目的。您不能用抽象类来实现这一点。您可以将列表
强制转换到这些接口中的任何一个,并在不知道其具体实现的情况下使用它们。这对于称为依赖注入的概念特别有用,但还有许多其他用途
当您希望定义对象实现的一部分,但希望将其他部分留给派生类时,抽象类非常有用。关于抽象类,需要记住的一点是它们不能自己实例化,因为它们通常缺乏完整的实现,而且事实上abstract关键字告诉编译器它不能实例化。是的,您可以提供虚拟实现,但是为什么呢?重点是摘要是。。好。。抽象的
假设你有一个类别猫,这个类别源于一个类别动物。没有动物物体这样的东西,它只是一种“类型”。你不能实例化一个动物,因为现实世界中没有真实的动物,只有动物类型的生物。您可以将不同的生物视为一种常见的动物类型,但