3

私はC#で書かれた.net Webサイトを持っており、他の開発者が使用できる機能を作成します。だから私はいくつかのデフォルトの実装を作り、開発者はいくつかのメソッドを上書きすることができます

例:クラスがShoppingCartあり、Productクラスの商品に、ショッピングカートがカートの合計価格を計算するためgetProductPrice のメソッドを呼び出すメソッドがあります。getProductPrice

ShoppingCartとはProduct同じプロジェクトにあり、開発者に.dllを提供して、ソースコードを変更できないようにして、後でアセンブリを更新できるようにします。

したがって、他のプロジェクトを作成し、製品クラスを拡張してメソッドを上書きし、getProductPrice独自のロジックを実装できるようにする必要があります。問題は、ショッピングカートが拡張メソッドを呼び出さず、元のメソッドを呼び出すことです。

開発者向けにすでに拡張プロジェクトを作成し、ショッピングカートが拡張メソッドを呼び出す場合、拡張製品には製品への参照が必要であり、ショッピングカートには拡張製品への参照が必要であるため、循環参照があります。

同じアセンブリ内でのみパーシャルを使用できるため、パーシャルクラスも機能しません

誰か提案がありますか?

前もって感謝します。

4

2 に答える 2

2

Productすべてのメソッドを仮想としてマークする必要があります:

public virtual decimal GetProductPrice() { };

その後、後で引き継ぐ開発者は、製品から継承し、メソッドをオーバーライドできます。

public class OverriddenProduct : Product
{
   public override decimal GetProductPrice() { }
}

OverridenProduct(上記の私の例では)から継承するため、クラス内のコレクションProductに追加できます。ProductShoppingCart

単なる意味論だと思いますが、ShoppingCartクラスのメソッドは、カート内の製品の総コストを取得していると想定しているのとはGetTotalPrice()異なるはずです。GetProductPrice()

于 2010-06-09T12:09:27.027 に答える
0

メソッドを仮想メソッドとして宣言します。これにより、継承クラスでオーバーライドできるため、その呼び出しは常にオーバーライドする実装にルーティングされます。仮想メソッドの詳細

また、GetProductPriceメソッドではなくプロパティとして実装する方が良いかもしれない何かのように聞こえます。

于 2010-06-09T12:08:18.423 に答える