2010-12-29 11 views
0

これは私の「私はそれが不可能だと思うが、私は確認が必要」という質問のもう一つです。子クラスの基本クラスから共有プロパティを継承できないのですか?

私は子クラスの束の基本クラスを持っています。現在のところ、この基本クラスには、子供が使用するいくつかの一般的なプロパティ(Nameなど)があります。ベースは抽象クラス(MustInherit)です。技術的には、これは、子クラスがインスタンス化されるたびに、Nameという独自のコピーをメモリにラグさせることを意味します。問題は、Nameが、指定された子のすべてのインスタンスに対して固定値になることです。すなわち、Child1.Name"child_object1"を返し、Child2.Name"child_object2"を返します。

このプロパティは共有プロパティの完全な候補に見えますが、問題が発生します。 Nameをベースクラスの共有プロパティとして定義すると、ベースから派生した子クラスが何であるかにかかわらず、すべてが共有プロパティ(またはメソッドなど)の正確な目的である同じNameを共有するように見えます。

私が考えることができる唯一の回避策は、Nameを基本クラスから削除し、各子クラスで直接共有プロパティとして再実装することです。しかし、これは基本クラスを持つという機能を最初から守っているようだ。少なくとも原理的には

私の質問は、デザインの観点からこの問題に取り組むための好ましいアプローチは何ですか? 1つの抽象基本クラスから少なくとも50の派生子クラスを想定します。

答えて

1

「子オブジェクト」と「子クラス」というときを想定します。用語を混同しないでください。それはあなたの質問をより混乱させます。

私はこのパターンを何度も使っています。共有/静的を考えるのは当然ですが、基本クラスから派生したクラスの各インスタンスが異なる名前を持つことができるので、ここでは適用できません。私は定数値を返すようにオーバーライドされた抽象プロパティを持つことで、何も間違っていることは何も見ません。

抽象メンバの目的は、子クラスが独自の実装を提供できるようにすることです。オブジェクトに「あなたの名前は何ですか?」と尋ねると何かが知る必要があります。子クラス自体はそのようなデータのための完全な場所であり、抽象メンバの実装は完全な意味を持ちます。

名前プロパティがタイプ自体の名前に基づいて何かを返す場合は、GetType().Nameで取得できます。そのため、名前コードの一部をプロパティのデフォルトの仮想実装に統合できる可能性があります。デフォルトの実装が適切なことをしないときにそれをオーバーライドします。これにより、パフォーマンスペナルティが無視できるほどの定型的なコードがたくさん削除される可能性があります。

(質問のタイトルに書かれている質問に答えるために、技術的にはタイプの非公開共有/静的メンバーはすべてすべてのサブタイプに継承されますが、共有/静的メンバー)

+0

@cdhowie:少し編集しました。私はそれらが半互換性のある用語であると考えました。 – Kumba

+1

@cdhowie:私は抽象的なアプローチについて考えました。しかし、私はそれを(少なくともVB.Netでは)共有することはできません。私は派生クラスの名前をモジュールにConstsとして格納しているので、基本クラスに抽象プロパティを定義し、子クラスでオーバーライドして定数を返すことができます。最初のアプローチは、基本クラスで定義された共通プロパティを保持し、各派生/子クラスにパラメータレスコンストラクタで 'MyBase.Name = CHILD1_NAME'を実行させることで、各クラスの混乱を減らすことでした。 – Kumba

+0

@クンバ:しかし、「共有」とは、そのプロパティの*インスタンスが1つしか存在しないことを意味し、ベースタイプに属します。したがって、各クラスのパラメータのないコンストラクタでプロパティを設定すると、**各オブジェクトの名前は、直前に作成されたオブジェクトの名前になります。あなたは共有と抽象を混在させることはできません。共有修飾子を削除して抽象的な状態にしておきます。グローバル変数を作成することを「共有」と考えてください。それはこのコンテキストで意味をなさないでしょうか? – cdhowie

関連する問題