2010-03-17 27 views
1

讓我們假設我們有下面的代碼:基本方法是否能夠使用派生的基礎數據成員?

abstract class Base1 { 
    protected int num; 
} 

class Der1:Base1 { 
    protected Color color; 
    protected string name; 
} 

class Der2:Base1 { 
    protected DateTime dthen; 
} 

等。存在一個base1類型的數組,其中包含許多由派生自base1的類創建的對象。

是否可以僅在基類中定義toString()方法? 類似:

public override string toString() 
{ 
    if (this is Der1) 
     return "num = " + this.num + "color = " + this.color.toString() + " name = " this.name; 
    if (this is Der2) 
     return "num = " + this.num + "dthen = " + this.dthen.toString(); 
    // and so on ... 
} 

非常感謝你:)

附:這不是一個家庭作業問題。我只是想知道。

回答

6

要做到這一點的唯一方法是將this投射到每個派生類型。 (即使這隻會在會員公開時才起作用)

但是,您確實應改寫該方法。

+2

+1讓CLR處理多態調度 - 它更乾淨,更快,更容易維護。 – 2010-03-17 13:34:49

+2

不,「((Der1)this).color'是一個編譯錯誤,即使在Base1類中也是如此。 – 2010-03-17 13:35:02

+0

@Anton:我已經編輯過。 – SLaks 2010-03-17 13:36:06

4

不,這是不可能的,除非您將所有成員的字段訪問修改器更改爲public

一般而言:這是一個不好的做法。基類不應該知道派生類的任何內容。

1

這是可能的,但

  • 派生類的成員應該公共
  • 你缺少一個明確的

    公衆覆蓋字符串的ToString() { 如果(這是Der1) 返回「num =」+((Der1)this).num + //等...

順便說一下,這很不好,你應該在派生類中Der1和DER2重寫的ToString - 這就是polimorphism是。

+0

這不會編譯 - 派生類的字段不公開。 – SLaks 2010-03-17 13:35:11

+0

@ SLasks:你說得對,謝謝。這不是真的重點,無論如何:) – 2010-03-17 13:38:50

1

你應該讓派生類處理它們的ToString版本應該如何表現。

讓基類依賴於所有派生類使得設計非常脆弱。

0

它看起來像你試圖避免的是複製在ToString()中打印其信息的抽象基類中的代碼。你可以使用像GetExtraString()這樣的基類中的虛擬方法來解決這個問題,後者在後代類中被覆蓋,只返回基類ToString()中的額外信息。

相關問題