为什么在没有C#参与继承的情况下可以覆盖ToString()方法?

时间:2016-04-09 00:10:51

标签: c# inheritance tostring

请查看以下示例:

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()',如下面的代码片段所示:

 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()'方法的这种特殊行为?

6 个答案:

答案 0 :(得分:6)

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

  

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

     

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

     

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

每个类型都是从oop中的对象派生出来的,那里定义了ToString()方法,而虚拟的则可以覆盖它

答案 3 :(得分:0)

ObjectToString()方法。每个类都继承自Object

答案 4 :(得分:0)

继承了ToString方法

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

你能猜出它是什么吗?

  

这是Object

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

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

答案 5 :(得分:0)

真的,你的MyClass派生自Object类。如果你使用

class MyClass : Object

结果是一样的。

相关问题