【问题标题】:Why ToString() method can be overridden without inheritance being involved in C#?为什么 ToString() 方法可以在 C# 中不涉及继承的情况下被覆盖?
【发布时间】:2016-04-09 00:10:51
【问题描述】:

请看下面的例子:

using System;

 class MyClass 
 {
   static int count = 0;
   int id;

   public MyClass() 
   {
     id = count;
     count++;
   }

 public override string ToString() 
 {
   return "MyClass object #" + id;
 }
}

 class Test 
 {
   static void Main() 
   {
     MyClass ob1 = new MyClass();
     MyClass ob2 = new MyClass();
     MyClass ob3 = new MyClass();
     Console.WriteLine(ob1);
     Console.WriteLine(ob2);
     Console.WriteLine(ob3);
   }
 }

程序的输出如下所示:

MyClass 对象 #0
MyClass 对象 #1
MyClass 对象 #2

正如您在此处看到的,方法 ToString() 在名为“MyClass”的类中被覆盖,但“MyClass”不是从任何类派生的,根本不存在继承。如果不涉及继承,如何使用“覆盖”?

如果我们将 ToString() 更改为任何其他方法名称说 'HelloString()',如下面的代码 sn-p:

 public class Program
 {
    public static void Main(string[] args)
    {            
        MyClass ob1 = new MyClass();
        MyClass ob2 = new MyClass();
        MyClass ob3 = new MyClass();
        Console.WriteLine(ob1);
        Console.WriteLine(ob2);
        Console.WriteLine(ob3);
    }
}

 class MyClass 
 {
   static int count = 0;
   int id;

   public MyClass() 
   {
     id = count;
     count++;
   }

 public override string HelloString() 
 {
   return "MyClass object #" + id;
 }
}

编译器抛出错误:'没有找到合适的方法来覆盖'

为什么使用 'ToString()' 方法会出现这种特殊行为?

【问题讨论】:

标签: c# inheritance tostring


【解决方案1】:

取自https://msdn.microsoft.com/en-us/library/system.object(v=vs.110).aspx

Object类是.NET Framework中所有类的终极基类;它是类型层次结构的根。

语言通常不需要类来声明继承自 对象,因为继承是隐式的。

因为 .NET Framework 中的所有类都是从 Object 派生的,所以 Object 类中定义的每个方法在系统中的所有对象中都可用。派生类可以并且确实会覆盖其中一些方法,包括:

  • 等于 - 支持对象之间的比较。
  • Finalize - 在对象被删除之前执行清理操作 自动回收。
  • GetHashCode - 生成对应于 对象以支持使用哈希表。
  • ToString - 制造一个人类可读的文本字符串,描述 类的一个实例。

【讨论】:

    【解决方案2】:

    它是从 Object 派生的,这是定义该方法的地方。

    【讨论】:

      【解决方案3】:

      每个类型都派生自 oop​​ 中的对象,这就是定义 ToString() 方法及其虚拟的地方,因此您可以覆盖它

      【讨论】:

        【解决方案4】:

        Object 有一个ToString() 方法。每个类都继承自Object

        【讨论】:

          【解决方案5】:

          ToString 方法继承了!

          所有类都隐式继承自一件事。结构也继承自它。通过装箱,您可以将结构分配给该类型的变量。

          你能猜出它是什么吗?

          我是Object

          此类包含ToStringGetHashCodeEquals 等方法,您可以重写这些方法来定义您自己的对象行为。你可以在这里看到更多:

          https://msdn.microsoft.com/en-us/library/system.object(v=vs.110).aspx

          【讨论】:

            【解决方案6】:

            确实,您的 MyClass 是从 Object 类派生的。如果你使用

            class MyClass : Object
            

            结果是一样的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-07
              • 2012-09-16
              • 1970-01-01
              • 2016-08-29
              • 2016-05-29
              • 2021-06-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多