ToString Method

本文关键字:Method ToString | 更新日期: 2023-09-27 18:10:32

嗨,我有一个class Form和class SpecificForm。类SpecificForm继承Form。Specific Form有一个重写ToString方法,它写一个有意义的字符串。然而,当我调用ToString或类Form的对象时,我得到以下输出:

FormProxy923a5e0e9d7a46b7baa4dfe2173af18c

知道为什么我不能得到自定义字符串,即使我重写它。

任何想法和建议都非常感谢!

    /// <summary>
    /// Override of tostring
    /// </summary>
    public override string ToString()
    {
        if (this.Description == null)
            return this.Form.ToString();
        return this.Description;
    }

ToString Method

我不确定我是否理解这个问题,但如果我做对了,你想知道为什么类型Form的实例不像类型ExtendedForm的实例。

重写只替换'子'类型对象上的方法,而不是'父'类型对象上的方法。首先,这不是继承应该如何工作的,但实际上也不可能,也就是说,如果你有两个扩展类;应该使用哪个ToString重写?

下面应该解释它是如何工作的。

 public class ClassBase
 {
      public override string ToString()
      {
           return "base";
      }
 }
 public class ClassA : ClassBase
 {
      public override string ToString()
      {
           return "A";
      }
 } 
 public class ClassB : ClassBase
 {
      public override string ToString()
      {
           return "B";
      }
 } 
 public class ClassC : ClassA
 {
      // No override
 }

这将产生如下

 ClassBase baseClass = new ClassBase();
 baseClass.ToString() // Returns "base"
 ClassA aClass = new ClassA();
 aClass.ToString(); // Returns "A"
 ClassB bClass = new ClassB();
 bClass.ToString(); // returns "B"
 ClassC cClass = new ClassC();
 cClass.ToString(); // returns "A" because no override exists

请记住,你有什么类型的引用并不重要。假设你有一个对ClassBase的引用,它实际上引用了一个ClassA,那么ClassA的重写仍然会被称为

  ClassBase baseClass = new ClassA();
  baseClass.ToString(); // Returns "A" because baseClass is actually a ClassA

你看不到你的新方法,因为Form类是而不是一个SpecificForm类。继承只向一个方向移动。如果基类型也具有子类型的属性,那么当两个子类型都添加具有相同名称的成员时会发生什么情况?

你不清楚问题是什么,代码示例总是有帮助的,但我将涵盖我能想到的两个:

Form form = new Form();
form.ToString(); //returns FormProxy923a5e0e9d7a46b7baa4dfe2173af18c

这是预料之中的,因为这里没有涉及到SpecificForm。

Form form = new SpecificForm();
form.ToString(); //returns FormProxy923a5e0e9d7a46b7baa4dfe2173af18c

这可能是由于ToString()定义中缺少override关键字引起的,它应该看起来像这样:

public override string ToString()
{
    //Do stuff
}

如果缺少override,则默认行为是创建一个非虚拟方法,该方法仅影响示例中SpecificForm类型的变量。

不确定我是否理解了你的问题。如果你在问为什么这部分:

return this.Description;

不执行,而不是执行这部分:

if (this.Description == null)
return this.Form.ToString();

我只能说,"这个。"