关于抽象类?

时间:2010-05-15 17:04:38

标签: c# .net inheritance abstract-class

网址:Link (1)

根据这个wesbite ..你不能实现抽象类,而是从它们派生。这是有道理的,我已多次阅读。

  

与接口类似,您无法实现抽象类的实例,但是您可以在抽象类中实现子类可以使用的方法,字段和属性。

但是在MSDN上

网址:TextWriter CLass on MSDN

TextWriter是一个抽象类,但它定义了两个构造函数......根据MS 70-536一书,以下语句有效:

TextWriter tw = new File.CreateText("myFile.Txt")

静态文件类和它的CreateText方法对我来说很好,因为我研究过它 MSDN但有人可以解释我发现的这个小矛盾吗?当然我不是第一个?

为什么基本抽象类的即时性可能?

7 个答案:

答案 0 :(得分:4)

File.CreateText不返回TextWriter,而是返回StreamWriter,implements是一个TextWriter。

答案 1 :(得分:3)

你可以在这里实例化似乎是的抽象类,原因与你可以实例化接口似乎的原因相同:你实际上并没有创建一个类该类型,但创建一个可以强制转换为该类型的类。 tw可以定义为TextWriter,但它实际上不能 一个TextWriter。

但是,我对新关键字持怀疑态度。你确定有效吗?它不应该。 File.CreateText创建并返回(继承自)TextWriter,但new表示构造函数,这不是正在发生的事情。

答案 2 :(得分:3)

所有抽象类至少有一个构造函数 - 要么实现一个,要么编译器生成无参数的默认构造函数。在实例化派生类时执行构造函数 - 基类是抽象的并不重要。

但是你无法实例化一个抽象类 - File.CreateText()是一个静态方法,它返回一个派生自TextWriter但不是TextWriter实例的类的实例。

答案 3 :(得分:1)

File.CreateText的实现是创建并返回一个类型,它是TextWriter的具体实现。即无论返回什么类型是一个 TextWriter - 它不是一个抽象类的神奇实例化。

虽然您无法创建抽象类,但您可以通过其基类型将其引用为派生类型的实例而不会出现问题。如果你不能这样做,那么多态就没用了!

答案 4 :(得分:1)

多态/继承的魔力。

File.CreateText返回StreamWriter,其继承自TextWriter

答案 5 :(得分:1)

这是不可能的。

正在发生的事情(一旦删除new关键字以使代码完全正常工作),CreateText方法正在创建StreamWriter的实例,该实例继承TextWriter }。 StreamWriter引用已分配给TextWriter变量,该变量有效,因为StreamWriterTextWriter

抽象类具有构造函数的原因是初始化抽象类中的数据。构造函数不能直接使用,但它将由继承抽象类的类中的构造函数调用。

答案 6 :(得分:0)

CreateText返回StreamWriter

public static StreamWriter CreateText(string path)

StreamWriter是TextWriter的子类,因此可以存储在TextWriter变量中。这个例子是使用抽象类,因为它不关心它正在写文本的实际实现。