2009-07-13 10 views
0

私のプロジェクトでは、共通ページ機能を保持するためにベースページを使用しています。ベースページが巨大になるまで働いたので、ベースページをいくつかのクラスに分解しようとしました。私はこれを取ることになっています方法ASP.NETベースページの多重継承をシミュレートする方法は?

public class SecurePage : RadAjaxPage 
{ 
    // Add session id to ViewStateUserKey 
} 

public class PageWithGridViewSorting : RadAjaxPage 
{ 
    // add sorting to all grids on page 
} 

public class PageWithSessionWarning : RadAjaxPage 
{ 
    // inject javascript to warn user of impending session end 
} 

:?それから私は私のようなものを与え

public MyPage : SecurePage, PageWithGridViewSorting, PageWithSessionWarning 

を書くことができないことに気づきましたかそして、私は、これがASP.NETページであるという事実は、それが私ではなく、フレームワークによって構築されるクラスであるため、関連性があると思います。私の最初の考えは、コンストラクタのオーバーライドを行い、フィーチャを渡すことでしたが、System.Web.UI.Pageを使って作業することはありませんでした。

+0

他のクラスからこの機能を呼び出すことができますか?その場合は、適切なオブジェクトをインスタンス化するか、静的クラスにして、そのようにメソッドを呼び出すだけです。 – Powerlord

+0

@RBembros通常、このコードはPage_Load、OnInitなどにフックするため、イベントやページのライフサイクルを通じてコードを呼び出すASP.NETパイプラインです。静的なメソッドのためによく取られた点、私はそれらが基本クラスにある必要はないことに同意します。 – MatthewMartin

答えて

4

SecurePagePageWithGridViewSortingPageWithSessionWarningによって提供される機能は、実際に彼らの派生クラスでオーバーロードしたりオーバーライドする必要がありますか?

継承を使用して関数をグループ化するだけであれば、関数をクラスに編成する別の方法を検討する必要があります。たとえば、Strategy patternと同様です。ソートのあるページは並べ替えのあるページです。 ソートのページです。継承を使用することは、この問題にアプローチする正しい方法ではありません。

の場合は、派生クラスが異なる必要がある場合は、継承の代わりにインターフェイスで問題にアプローチしたい場合があります。とにかく関数を再定義するので、これは複雑さを増やしたり、あなた自身を繰り返すべきではありません。

編集:あなたの問題の詳細を考えれば、aspect-oriented programmingを調べてfit it into your languageを調べる必要があるように私には本当に聞こえます。

3

私はいくつかのコンテンツをBasePageからUserControlsに移動しようとします。 PageWithSessionWarningと言うことができます。これは、あなたがマスターページに置いたコントロールである可能性があります。

2

私はASP.NETがあなたが継承の構成を好むべき環境だと思います。 Pageイベントにフックして機能を提供するヘルパークラスからページを構成することによって、コードを再構成して必要な機能を「注入」することを検討する必要があります。 を他のページで使用できる共有構造に変換します。

ページライフサイクルが複雑で、一般的なコードを記述しようとすると「しばしば」得られることがあるため、ASP.NETでうまくいくのは難しいことです。

機能がUI中心の場合は、機能をカスタムコントロールまたはユーザーコントロールに移動することもできます。

はまた、マスターページは、ページのうち、共通の機能を因数分解に効果的な方法であり、