2009-08-25 96 views
5

有像這樣的:如何使用方法實現基類並強制派生類覆蓋它?

public abstract class AAA 
{ 
    protected abstract virtual string ToString() // Error 
    { 
    // Base Stuff 
    } 
} 

public abstract class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString(); 
    // More Stuff 
    } 
} 

我讀到另一篇文章(abstract method in a virtual class)女巫是相當喜歡我的問題,但有一點區別。我想AAA.ToString()有一個基本行爲強制派生類來覆蓋它。

我知道我可以做這樣的事情(向下滾動),但我正在尋找一個合適的方式。

public abstract class AAA 
{ 
    public abstract string ToString(); 
    protected string ToString2() 
    { 
    // Base Stuff 
    } 
} 

public class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString2(); 
    // More Stuff 
    } 
} 

我也大概可以做一個IAAA接口,並建立我的BBB級像

public class BBB : AAA, IAAA { ... } 

但不看我的權利。

回答

5

你的方法本質上是正確的方法...

編輯:

你的 「規範」 是:

  1. 默認行爲
  2. 需要覆蓋

現在,因爲你的應用程序耳朵要始終執行的「默認行爲」,你需要

public string ToString() 
{ 
    // placeholder for some default behaviour 

    string result = doToString(); 

    // placeholder for some more default behaviour 

    return result; 
} 

protected abstract string doToString(); 

這隻能如果你知道基類一般做,並希望提供實現在派生類中doToString()。這就是所謂的Template Method設計模式。

但是,如果你正在尋找一種方式來需要派生類的實施者調用base.ToString()在其實施的ToString(),那麼就沒有辦法做到這一點。通過允許覆蓋,您可以對派生類的實現進行控制。

您可以記錄您的建議,始終致電base.ToString(),但就是這樣。

使用接口定義您的班級的公共合同。由於您仍然需要從基類派生以獲取「默認」實現,因此這不會爲Template Method模式帶來額外的好處。

你有沒有關於你想在基類中提供什麼作爲「默認行爲」的細節?也許這將有助於獲得更好的解決方案。看看引用的問題,這基本上是相同的方法。

+0

謝謝,您的編輯讓我意識到一些重要的東西!即使我會找到奇蹟的方式來在基類中定義ToString()並強制派生類中的重寫,但我根本沒有辦法強制重寫使用ToString()!我還發現了一個關於強制覆蓋的MVP的帖子:http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/c25b6477-b990-4284-abaf-801ddf18207c。再次感謝先生。 – Tipx 2009-08-25 03:46:25

+0

很高興爲您服務。這篇文章是由Marc Gravell撰寫的......他也很出名:) – 2009-08-25 04:07:10

+0

這與以下張貼的答案比較如何? – Armbrat 2009-08-26 00:45:19

0

不,不可能將當前的虛擬函數變成抽象函數。正如你所建議的那樣,執行此操作的唯一方法是創建另一個抽象的函數。這可以說是一個更合適的方法(我同意這一點)。

2

我剛剛找到了如何做才能得到完全我想要的行爲:

public abstract class AAA 
{ 
    protected abstract string ToStringSpecific(); 
    protected string ToString() 
    { 
    // Base Stuff 
    ... 
    // Use this.ToStringSpecific(); 
    } 
} 

public class BBB : AAA 
{ 
    protected override string ToStringSpecific() 
    { 
    // Specific Stuff 
    } 
} 
+0

我認爲你應該編輯你原來的問題... – Armbrat 2009-08-26 00:44:49

+0

我確實會編輯問題(和標題),以便它可以幫助某人找到這個主題,但我會讓我的解決方案在這裏。 (如果不這樣做,就不會有e「Anwser Your Question」按鈕) – Tipx 2009-08-26 03:06:26

+0

我只是重讀了我評論的第二部分,它「聽起來」很傲慢。我很抱歉,我不是故意的,我不能編輯評論。我道歉。 – Tipx 2009-08-26 03:13:02

相關問題