複数の継承/コードの複製なしでページと傑作の間でコードを共有する方法は?
-
02-10-2019 - |
質問
私は読んだ 質問と回答 それを説明します C#には複数の継承はありません, 、私たちはそれを必要とせず、それがあまりにも多くの問題を引き起こすこと。
今、私は、コードを複製することなく、複数の継承なしでどのように何かをすることができるかを本当に理解していないプロジェクトに取り組んでいます。
これが状況です。ホームページと傑作から継承されている他のページを備えたウェブサイトがあります(ホームページは継承しません)。ページと傑作の両方がいくつかのものを実行しています:カスタムログイン、統計、カスタマイズのためのユーザー設定の読み込みなど。今のところ、ソリューションは安っぽいです。 これらのタスクのソースコードは2回コピーされます.
ホームページのクラスは継承します Page
. 。一方、傑作は Masterpage
. 。論理的には、共通のクラスからも継承することは素晴らしいことですが、それは多継承であるため、不可能です。
では、代わりに何をすべきか?
私はいくつかの方法を考えましたが、それらを嫌う:
aを作成します ページ/傑作クラスから呼び出されるスタンドアロンクラス. 。たとえば、書く代わりに
bool isDisplayingTips = this.CurrentUser.IsDisplayingTips
, 、私は書くでしょうbool isDisplayingTips = this.SharedObjects.CurrentUser.IsDisplayingTips
. 。書くのが長いので、私はそれが好きではありません。「本物」、空、 一般的な傑作, 、そして、ホームページとそれからの傑作の両方を継承します。傑作パラメーターにアクセスするためにさらにコードを作成する必要があるだけでなく、各リクエストに追加の傑作が必要になることも遅くなります。
何か案が?
解決
傑作は正当なコントロール(実際のページに埋め込まれます)であるため、後のアプローチはできません。ただし、別のヘルパークラスを作成する最初のアプローチは非常に実現可能です。
私たちが通常使用するさらに別のアプローチは
- 一般的なベースページクラス - すべてのページは、共通ベースページから継承されます。
- ベースページクラスに共通の機能を置きます
- マスターページから、ベースページはキャストで参照できます - たとえば、
myBasePage = (BasePage)this.Page;
. 。この方法では、マスターページには、ベースページクラスから共通の機能にアクセスできます。
他のヒント
嫌いな2番目のオプションは見つかりません。
私はあなたが基本クラスを作成することを意味すると思います。 MasterPageBase
, 、 に由来する System.Web.UI.MasterPage
, 、そしてあなたのホームページのために空の傑作を作成する、それはこれから継承します MasterPageBase
.
正しく行われた場合、それは物事を遅くしないでください...
最初のオプションを使用することをお勧めします。あなたが(当然のことながら)間接レベルの増加に慣れていない場合、あなたはあなたのスタンドアロンの塊に新しい方法を作成することができます:例:
public bool IsDisplayingTips(){
return CurrentUser.IsDisplayingTips;
}
そして、あなたのページから電話があります
bool isDisplayingTips = this.SharedObjects.IsDisplayingTips()
使用する:
ページ/傑作クラスから呼び出されるスタンドアロンクラス
ただし、そこで停止する代わりに、ベースページとベースマスターページを追加します。どちらも共有クラスを使用し、特定のページ/マスターページコードを間接から保持します。