1

以前にインターフェースについて質問したところ、素晴らしい回答がいくつかありました。本当に柔軟なコードの開発を開始できることをとても楽しみにしています。

仮想メソッドのオーバーライドについて質問があります。

現在、Community Server SDK を使用しています。コントロールの 1 つは、「タグ」パンくずです。したがって、関連するオブジェクトの「タグ」がリストされます。

<CSBlog:TagBreadCrumb />

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

私は Community Server の SDK を持っているので、「タグ リスト」をレンダリングするコントロールを見つけ、必要な変更を加えましたが、多くの理由でコアを変更するのは良くないと理解しています。

したがって、私がやりたいことは、ベース コントロールと本質的にほぼ 100% 同一である独自のコントロールを作成することですが、1 つのメソッドをオーバーライドします。

メソッドは次のとおりです。

 public virtual string FormatTags(string[] tagList)

内部にはタグをフォーマットするコードがあり、除外する「タグ」の構成ファイルをチェックすることを除いて、同じことをすべて行う独自のコードを書きたいと思います。

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

変更する必要があるのはその 1 つの側面だけですが、これは、そのメソッドの元のコードを基本クラスからコピーして、そこに必要なものを変更する必要があることを意味しますか? ある場所からコードを正しくコピーしているとは思えませんが、基本クラスのコードを変更せずにメソッドを拡張する別の方法を知りません。

提案をありがとう。

4

5 に答える 5

5

あなたの場合 (特定のタグがブレッドクラムに出力されないようにしたい場合)、基本メソッドを呼び出す前にすべての特別なタグを削除します。

したがって、コードは次のようになります。

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

この方法では、基本クラスが出力文字列をどのようにフォーマットするかを理解する必要はありません。

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

于 2009-03-19T18:16:54.420 に答える
4

導出されたメソッドを引き続き実行し、その結果を操作できます。

public override string FormatTags(string[] tagList) {
    string result = base.FormatTags(tagList);
    // do something with result
    return result;
}
于 2009-03-19T18:13:17.143 に答える
1

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

それは正しい; オーバーライドするときは、基本クラスのメソッドの独自の実装を提供します。

最良のケースでは、次の 2 つのいずれかが発生します。

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

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

残念ながら、ここではどちらも当てはまらないように思われるので、ゼロから作成する必要があるかもしれません。

于 2009-03-19T18:14:33.457 に答える
1

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

絶対に正しい。

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

于 2009-03-19T18:16:29.490 に答える
1

拡張メソッドを見てください。これらを使用すると、独自の静的クラスで関数を定義することにより、編集または拡張できないシール クラスの機能を拡張できます。これは私が書いたばかりの例です (構文エラーがあるかもしれません)。

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);
于 2009-03-19T18:16:38.243 に答える