2011-10-03 82 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