2011-10-03 84 views
2

嗨我有一个类窗体和类SpecificForm。 Class SpecificForm inherirts表格。具体表单有一个覆盖ToString方法,它写入一个有意义的字符串。然而,当我打电话类表的的ToString或对象我得到以下输出:ToString方法

FormProxy923a5e0e9d7a46b7baa4dfe2173af18c

为什么我不能够得到即使我重写它的自定义字符串的任何想法。

任何意见和建议,非常感谢!

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

     return this.Description; 
    } 
+4

你可以发布你的'ToString'方法和你如何使用它 – ChrisF

+6

而不是描述你的代码,发布你的代码。知道它真的是什么 –

+0

你使用一些依赖注入框架的形式? – svick

回答

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

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

0

你是不是对这个问题是什么,代码示例经常帮助清楚,但我将介绍两个我能想到的:

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

这是可以预料的,因为SpecificForm是不参与这里。

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

这很可能是由于缺少override关键字在你的ToString()的定义引起的,它应该是这样的:

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

如果缺少override的默认行为是创建一个非 - 虚拟方法,它只影响SpecificForm类型的变量。

0

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

return this.Description; 

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

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

我只能说,“这一点。描述“在这部分执行之前没有在你的编码路径中设置

+0

是说明是没有设置,但是Form.ToString()应该调用override方法,我检查了子类,并且它们都覆盖了ToString()方法 – SaiBand

+0

Form不是你的类,对吗?有点混淆与System.Windows.Forms类---> http://msdn.microsoft.com/en-us/library/system.windows.forms.form.aspx – Arun