在.NET Framework类库中,有一本书说
Console.In
是TextReader
的实例。
TextReader
是一个抽象类,那么如何才能有一个实例Console.In
?
StreamReader
是TextReader
的派生类,是一个非抽象类。
Console.In
是StreamReader
的实例吗?
答案 0 :(得分:1)
尝试
Console.WriteLine(Console.In.GetType());
结果是
System.IO.TextReader+SyncTextReader
所以Console.In
的类型为System.IO.TextReader.SyncTextReader
,这是一个嵌套在TextReader
中的类。
只有属性 Console.In
被声明为TextReader
SyncTextReader
显然来自。{/ p>
因此,在继承方面,句子" Console.In
是 TextReader
"的一个实例。是对的。
更新:确实(正如Jamiec评论的那样)这个SyncTextReader
有一个StreamReader
的基础实例。反过来,这是使用类型__ConsoleStream
的基础实例创建的。
答案 1 :(得分:1)
TextReader是一个抽象类,那么如何才能有一个实例Console.In?
你在逻辑上是正确的,但它(我会说)一般都明白,当你说"我有一个[抽象类]的实例"你真正的意思是"我有一个具体类的实例,它继承了一个抽象类"。它与接口相同,你可能会说"我有一个IFoo实例"你的实际意思是"我有一个类的实例,它符合IFoo"所规定的合同。
针对您的具体问题,disassembly is available您可以看到您基本上是对的。 实际类型当然是继承TextReader
的具体类。它在TextReader.Synchronized
个实例周围使用StreamReader
。
....
tr = TextReader.Synchronized(new StreamReader(s, enc, false,
_DefaultConsoleBufferSize, false));
....
答案 2 :(得分:0)
Console.In 的基类是 SynctextReader ,它派生自TextReader。
答案 3 :(得分:0)
Console.WriteLine(Console.In.GetType().FullName);
给我们
System.IO.TextReader+SyncTextReader
SyncTextReader
是TextReader
内的嵌套类。它不是抽象的,而是内部的
见https://referencesource.microsoft.com/#mscorlib/system/io/textreader.cs,311