2009-08-25 16 views
5

はこのようなもの持って:私は別のポスト(abstract method in a virtual class)魔女を読んメソッドを使用して基本クラスを実装し、派生クラスをオーバーライドする方法

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 
    } 
} 

はかなり私の質問のようなものだったが、少し違いがあります。私は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インターフェイスを作成し、

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

ように私のBBBクラスを構築するが、右に私には見えませんでした。

答えて

5

あなたのアプローチは...基本的に適切な方法ある

編集:

あなたの "仕様" は次のとおりです。

  1. デフォルトの動作
  2. 必要オーバーライド

あなたのアプリあなたは、基本クラスは、一般的には何をしているか知っている、と派生クラスでdoToString()のための実装を提供したい場合は、必ず実行される「デフォルトの動作」を先にするの耳は、あなたがこれだけ作品

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

    string result = doToString(); 

    // placeholder for some more default behaviour 

    return result; 
} 

protected abstract string doToString(); 

を必要としています。これはTemplate Methodデザインパターンとして知られています。

しかし、あなたはへの道を探している場合ToString()の実装でbase.ToString()を呼び出すために派生クラスの実装を必要とし、これを行う方法はありません。オーバーライドを許可することで、派生クラスはその実装を制御できます。

あなたはいつもbase.ToString()を呼び出すように勧告を文書化することができますが、それだけです。

インターフェイスを使用すると、クラスの公開契約が定義されます。これは、 "デフォルト"実装を取得するために基本クラスから派生する必要があるため、テンプレートメソッドパターンに対して追加の利点はありません。

"既定の動作"として基本クラスで提供しようとしていることについての詳細はありますか?たぶんそれはより良い解決に役立つでしょう。参照される質問を見ると、これは本質的に同じアプローチです。

+0

おかげで、あなたの編集は私が何か重要なことを実感しました!基底クラスでToString()を定義し、派生クラスでオーバーライドを強制する奇跡の方法を見つけたとしても、ToString()を使用するように強制することはできません。私はまた、強制的にオーバーライドについてMVPによってこのポストを見つけました:http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/c25b6477-b990-4284-abaf-801ddf18207c。おめでとうございます。 – Tipx

+0

サービスの喜び。その投稿はMarc Gravellです...彼はあまりにもよく知られています:) –

+0

これは、以下に掲載されたOPの回答とどのように比較されますか? – Armbrat

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

+0

質問とタイトルを編集して誰かがこのトピックを見つけるのを助けるかもしれませんが、ここで私の解決策を教えてください。 (このようにしてはならない場合は、「Anwser Your Question」ボタンがありません) – Tipx

+0

私のコメントの2番目の部分をもう一度読んで、それは傲慢な "音"です。申し訳ありませんが、私はなることを意味しなかった、私はコメントを編集することはできません。私は謝罪します。 – Tipx

関連する問題