ToString方法

时间:2011-10-03 22:25:28

标签: c# tostring override

嗨,我有一个Class Form和Class SpecificForm。 Class SpecificForm继承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;
    }

4 个答案:

答案 0 :(得分:2)

我不确定我是否理解这个问题,但是如果我做对了,你就会想知道为什么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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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类型的变量。

答案 3 :(得分:0)

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

return this.Description;

不执行而不是执行此部分:

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

我只能说,在此部分执行之前,您的编码路径中未设置“this.Description”。