实例与对象。抽象类原则的实例?

时间:2015-09-19 05:18:02

标签: c# oop object instance abstract-class

我读过一本书:

  

字符流层次结构的顶部是抽象   课程 TextReaderTextWriter

在同一本书中它说:

  

不可能创建抽象类的对象,我们可以使用   它只能通过覆盖抽象的继承类来实现。

Console.InTextReader实例。如何从abstract类创建实例?可以有人解释一下。 instanceobject之间有何区别。

2 个答案:

答案 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有关,但它应该有助于你理解这些概念。