网址:Link (1)
根据这个wesbite ..你不能实现抽象类,而是从它们派生。这是有道理的,我已多次阅读。
与接口类似,您无法实现抽象类的实例,但是您可以在抽象类中实现子类可以使用的方法,字段和属性。
但是在MSDN上
TextWriter是一个抽象类,但它定义了两个构造函数......根据MS 70-536一书,以下语句有效:
TextWriter tw = new File.CreateText("myFile.Txt")
静态文件类和它的CreateText方法对我来说很好,因为我研究过它 MSDN但有人可以解释我发现的这个小矛盾吗?当然我不是第一个?
为什么基本抽象类的即时性可能?
答案 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
变量,该变量有效,因为StreamWriter
为TextWriter
。
抽象类具有构造函数的原因是初始化抽象类中的数据。构造函数不能直接使用,但它将由继承抽象类的类中的构造函数调用。
答案 6 :(得分:0)
CreateText返回StreamWriter
public static StreamWriter CreateText(string path)
StreamWriter是TextWriter的子类,因此可以存储在TextWriter变量中。这个例子是使用抽象类,因为它不关心它正在写文本的实际实现。