2017-08-04 79 views
-3

我可能没有使用正确的标题,但我不确定这些条款。C#中,我如何从抽象类中找出派生类型? (TextWriter)

所以我想使用TextWriter这是一个抽象类。我发现一段代码如下所示:

TextWriter writer = File.CreateText("path"); 

编辑:我如何知道StreamWriter类型是必需的?我从TextWriter的代码中可以看到,它是抽象的。

+4

我不明白你的问题。 - “我怎么知道该用什么......” – Jamiec

+0

仅仅使用'TextWriter'会让你失望吗? –

+0

我都没有。只要所有这些类都是'TextWrter'的实例,为什么你要关心该方法是否返回'StreamQriter'或甚至是'MyClass'? – HimBromBeere

回答

0

我怎么知道该StreamWriter的类型是必需的?

那么,StreamWriter不是需要。它可以使用,但不是要求

声明编译类型为TextWriter的变量只是表示可以为其分配任何种类的TextWriter。你可以例如把StringWriter放在那里:

TextWriter writer = new StringWriter(new StringBuilder("Hello World!")); 

这是没有问题的编译。

重要的不是什么是需要放在那里,而是你想要做什么。如果你想写一个流去放一个StreamWriter在那里,如果你想写一个StringBuilder去放一个StringWriter那里,如果你想写的东西去创建你自己的子类,并在那里使用。另外,你甚至不需要写TextWriter。可以很好地做这样的事情:

StreamWriter writer = File.CreateText("path"); 

“那有什么用的TextWriter如果我可以指定特定类型的我想要什么?”你可能会问。

有时候你可能想编写一个通用的方法,对吧?就像写作“Hello World”一样,但该方法并不在乎它将写入的位置。

public static void WriteHelloWorld(TextWriter writer) { 
    writer.Write("Hello World"); 
} 

如果您通过StreamWriter它将写入一个流。如果你通过一个StringWriter它会写入一个字符串等等。

+0

谢谢,这更接近我想学的东西。所以 - 你怎么知道可以使用StringWriter,例如?这就是我所要求的。我看不到我的代码本身。 – user970696

+0

@ user970696可以使用从“TextWriter”继承的所有东西。它在文档中显示.NET框架中的哪些类型继承自它:https://msdn.microsoft.com/zh-cn/library/system.io.textwriter(v=vs.110).aspx查看“继承层次结构”部分。你现在明白了么? – Sweeper

0

确实是一个StreamWriter实例返回。从msdnFile.CreateText Method (String)

此方法等效于设置为false追加参数的StreamWriter(字符串,布尔值)构造过载。

但确实建议使用它作为抽象类的对象。

如果wnat,你可以检查返回的实例的类型:

TextWriter writer = File.CreateText("path"); 
Type type = writer.GetType(); //System.IO.StreamWriter in this case 
+0

@ user970696我添加了代码来显示“编写器”实例的类型 – meJustAndrew

+0

但这不是我所要求的。你怎么知道StreamWriter是预期的?你如何从TextWriter的代码中知道?除非我看了MSDN,否则我不知道该用什么。 – user970696

相关问题