我读过一本书:
字符流层次结构的顶部是抽象 课程
TextReader
和TextWriter
。
在同一本书中它说:
不可能创建抽象类的对象,我们可以使用 它只能通过覆盖抽象的继承类来实现。
但Console.In
是TextReader
的实例。如何从abstract
类创建实例?可以有人解释一下。 instance
与object
之间有何区别。
答案 0 :(得分:2)
好的,让我们在我的系统(现在的Mono 4)上运行Console.In
- 运行时它的类型是:
Console.In.GetType()
{System.IO.CStreamReader}
(这是直接窗口 - 我留下了其他东西;))
因此,即使In
static
类的属性System.Console
属于TextReader
类型,它的实际值当然可以是{{1}的任何派生类(所以TextReader
只需要以某种方式从CStreamReader
派生出来。
这基本上是继承背后的 magic - 你可以编写适用于任何 TextReader
的代码,即使你不能直接创建其中一个。
顺便说一下,您不必考虑抽象类来实现这一点 - 只需考虑接口 - 这些在某种意义上是最抽象的所有的东西(因为在.NET中它们不能仅包含抽象成员) - 你不能直接实例化接口 - 但你当然可以给出其类实现它的对象。
遗憾的是,你不能设置 TextReader
属性,因为它是readonly(我不想使用一些反射魔法)所以我必须创建自己的Console.In
):
MyConsole
但是在这里您可以看到您现在可以设置static class MyConsole
{
public static System.IO.TextReader In { get; set; }
public static string ReadLine()
{
return In.ReadLine ();
}
public static void WriteLine(string line)
{
Console.WriteLine (line);
}
}
属性,它将使用.In
实例:
StringReader
尝试一下 - 您会看到它会读取var reader = new System.IO.StringReader ("Hello you\nwhat's up");
MyConsole.In = reader;
var l1 = MyConsole.ReadLine ();
MyConsole.WriteLine (l1);
var l2 = MyConsole.ReadLine ();
MyConsole.WriteLine (l2);
和"Hello you"
行并打印出来。
答案 1 :(得分:0)
它被称为Polymorphism。您看到的对象的类名称为" TextReader"是Console.in,因为Console.in继承自TextReader
回答你的问题"实例与对象之间有什么区别" 请see this explanation。我知道这个链接与Java有关,但它应该有助于你理解这些概念。