【问题标题】:Instance vs Object. Instance of an abstract class principle?实例与对象。抽象类原理的实例?
【发布时间】:2015-12-16 08:12:37
【问题描述】:

我读过一本书:

在字符流层次结构的顶部是抽象 类 TextReaderTextWriter

在同一本书中它说:

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

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

【问题讨论】:

  • Console.In 是派生自TextReader 的某个类的实例。
  • @PetSerAl 我认为Console 类没有任何父类,除了System.Object。你可以解释吗?还是我很困惑?
  • @Zeeshan 我没说Console班级家长。
  • @PetSerAl 我很困惑,谢谢:)

标签: c# oop object instance abstract-class


【解决方案1】:

好的,让我们使用Console.In - 在我的系统(现在是 Mono 4)上,它的类型是:

Console.In.GetType()
{System.IO.CStreamReader}

(这是直接窗口中的 - 我留下了其他东西;))

所以即使staticSystem.Console 类的属性InTextReader 类型,它的实际值当然可以是TextReader 的任何派生类(所以CStreamReader 只需以某种方式源自TextReader)。

这基本上是继承背后的魔法 - 您可以编写适用于 any TextReader 的代码,即使您无法直接创建其中之一。

顺便说一句,您不必考虑 抽象 类来实现这一点 - 只需考虑 接口 - 从某种意义上说,这些是最抽象的 最重要的事情(因为在 .NET 中它们不能只包含 abstract 成员)——你不能直接实例化一个接口——但你当然可以给出其类实现它的对象。

演示

遗憾的是,您无法设置 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""what's up" 行并将它们打印出来。

【讨论】:

  • 很遗憾你不能设置 Console.In 属性,因为它是只读的 Mono 没有 Console.SetIn 方法吗?
  • 不...这就是我使用MyConsole的原因(我在那里展示了所有代码)
【解决方案2】:

实例和对象有什么区别?

实例是内存中的对象。基本上,您在使用它们时创建对象并实例化它们。

但是 Console.In 是 TextReader 的一个实例。

如果你这样做

  Type res = Console.In.GetType();

并检查它。然后你会得到类似

注意这里的基数是SynctextReader,它派生自TextReader

C# 中的声明类似于:

namespace System.IO
{
   public class TextReader
   {
      class SyncTextReader : TextReader
      {
      }
   }
}

所以Console.In 不是textReader 的实例,而是属于SyncTextReader

【讨论】:

    【解决方案3】:

    它被称为Polymorphism。您看到的“TextReader”对象的类名是 Console.in,因为 Console.in 继承自 TextReader

    回答您的“实例与对象有什么区别”的问题 请see this explanation。我知道此链接与 Java 相关,但它应该可以帮助您理解这些概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多