2009-03-19 13 views
1

私は以前インターフェースに関する質問をしていて、すばらしい反応を得ました。私は本当に柔軟なコードを開発することに興奮しています。別のアセンブリでメソッドをオーバーライドする方法は?

ここで、仮想メソッドのオーバーライドに関する質問があります。

私は現在コミュニティサーバーSDKを使用しています。コントロールの1つは「タグ」パン粉です。したがって、関連するオブジェクトに「タグ」が表示されます。

<CSBlog:TagBreadCrumb /> 

しかし私は、これらのタグは、エンドユーザーには関係ありません、管理者へのレイアウトに表示されるコンテンツの特定のスポットをターゲットにできるように、タグを使用しています。たとえば、Home_Mainタグはホームページのメインパネルをターゲットにするために使用されますが、ユーザーには表示させたくありません。

私はコミュニティサーバー用のSDKを持っているので、私は「タグリスト」をレンダリングし、自分が望むことを行うための変更を加えました。しかし、私の理解は、多くの理由でコアを修正するのは良くない。

私がしたいのは、本質的に基本コントロールとほぼ100%同一ですが、1つの方法をオーバーライドする独自のコントロールを作成することです。ここで

はメソッドです:タグをフォーマットするためのコードがあるの内側

public virtual string FormatTags(string[] tagList) 

、そして私がチェックし、設定ファイルを除いて、同じもののすべてを行い、自分のコードを記述したいと思います除外する 'タグ'。

私の理解では、ベースコントロールから派生したコントロールを作成し、独自のFormatTags()メソッドを記述できます。

私はそれを変更する必要がありますが、これは基本クラスからそのメソッドの元のコードをコピーしてそこに必要なものを変更する必要があるということですか?それはちょうど1つのスポットからコードをコピーするように感じることはありませんが、ベースクラスのコードを変更することなくメソッドを拡張する別の方法はわかりません。

ありがとうございます。

答えて

4

あなたはまだdervied方法を実行して、それの結果を操作することができますので、私の理解は、私は基本コントロールから派生する、私のコントロールを作成することである

public override string FormatTags(string[] tagList) { 
    string result = base.FormatTags(tagList); 
    // do something with result 
    return result; 
} 
+0

興味深い! FormatTagsで起こることの1つは、タグがリンクに変わることです。そのため、タグを解析するのではなく、解析するのが難しくなります。私はそれに対処する必要がありますか?その時点で、ベースコードをコピーして変更しますか?ありがとうございました。 – user53885

1

- と私は(私自身のFormatTagsを書くことができます)メソッド - それは正しいですか?

そうです。オーバーライドすると、基本クラスのメソッドの独自の実装が提供されます。最良の場合には

、2つのうちの1つが起こる:

  • 望ましい結果に、基本クラスのメソッドの出力を変換する簡単な方法があります。

  • 基本パターンは戦略パターンまたはその変形を使用しているため、戦略の適切な部分の代替実装を提供するだけです。

残念ながら、いずれの場合もこのようには聞こえませんので、最初から書き込む必要があります。

1

だから私の理解では、私は基本 コントロールから派生する、 私のコントロールを作成することである - そして私は自分の FormatTags()メソッドを書くことができる - ということは正しいでしょうか?

絶対に正しい。

多くのコードをコピーする必要があることがわかっている場合は、方法の再構築を検討する必要があります。オーバーライドしない別のメソッドにコピーしているコードを置き、FormatTagsをオーバーライドするときに必要なものを変更し、他のメソッドを呼び出してコピーしたコードにアクセスします。

1

extension methodsをご覧ください。これにより、独自の静的クラスで関数を定義することによって、編集または拡張できない密封クラスの機能を拡張することができます。ここに私が書いた例があります(構文エラーがあるかもしれません)。

public static class MyExtensions 
{ 
    public static string AppendCrazyText(this string s, string crazyText) 
    { 
     return s + crazyText; 
    } 
} 

さて、これにアクセスするには、私は単純に呼び出すことができますあなたの場合は

string myString = "Hello world"; 
string myCrazyText = ", lets go crazy!"; 

string myResult = myString.AppendCrazyText(myCrazyText); 
5

(あなたがパンくずで印刷されてから特定のタグを抑制したい場合は)、あなたはすべての特殊を取り除くでしょうタグを呼び出してからベースメソッドを呼び出します。

public override string FormatTags(string[] tagList) 
{ 
    // strip special tags 
    string[] newTagList = stripTags(tagList); 
    return base.FormatTags(newTagList); 
} 

あなたは、基本クラスは、出力文字列をフォーマットする方法を理解する必要はありません。この方法:

だからあなたのコードは次のようになります。

代わりに、出力文字列の形式を変更したい場合は、基本メソッドを呼び出すことはありません(そのメソッドは将来のリリースでフォーマットを変更する可能性があるため影響を受けません〜によって)。

+0

うわー。それを見て電球が消えた!!ありがとうございました! – user53885

関連する問題