我可能沒有使用正確的標題,但我不確定這些條款。C#中,我如何從抽象類中找出派生類型? (TextWriter)
所以我想使用TextWriter這是一個抽象類。我發現一段代碼如下所示:
TextWriter writer = File.CreateText("path");
編輯:我如何知道StreamWriter類型是必需的?我從TextWriter的代碼中可以看到,它是抽象的。
我可能沒有使用正確的標題,但我不確定這些條款。C#中,我如何從抽象類中找出派生類型? (TextWriter)
所以我想使用TextWriter這是一個抽象類。我發現一段代碼如下所示:
TextWriter writer = File.CreateText("path");
編輯:我如何知道StreamWriter類型是必需的?我從TextWriter的代碼中可以看到,它是抽象的。
我怎麼知道該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
它會寫入一個字符串等等。
謝謝,這更接近我想學的東西。所以 - 你怎麼知道可以使用StringWriter,例如?這就是我所要求的。我看不到我的代碼本身。 – user970696
@ user970696可以使用從「TextWriter」繼承的所有東西。它在文檔中顯示.NET框架中的哪些類型繼承自它:https://msdn.microsoft.com/zh-cn/library/system.io.textwriter(v=vs.110).aspx查看「繼承層次結構」部分。你現在明白了麼? – Sweeper
確實是一個StreamWriter
實例返回。從msdn約File.CreateText Method (String)
:
此方法等效於設置爲false追加參數的StreamWriter(字符串,布爾值)構造過載。
但確實建議使用它作爲抽象類的對象。
如果wnat,你可以檢查返回的實例的類型:
TextWriter writer = File.CreateText("path");
Type type = writer.GetType(); //System.IO.StreamWriter in this case
@ user970696我添加了代碼來顯示「編寫器」實例的類型 – meJustAndrew
但這不是我所要求的。你怎麼知道StreamWriter是預期的?你如何從TextWriter的代碼中知道?除非我看了MSDN,否則我不知道該用什麼。 – user970696
我不明白你的問題。 - 「我怎麼知道該用什麼......」 – Jamiec
僅僅使用'TextWriter'會讓你失望嗎? –
我都沒有。只要所有這些類都是'TextWrter'的實例,爲什麼你要關心該方法是否返回'StreamQriter'或甚至是'MyClass'? – HimBromBeere