2017-08-04 49 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

相關問題