3

私には2つのクラスがあり、一方は他方を継承します。たとえば、次のようになります。

public class A
{
    public string AA { get; set; }
    public double AB { get; set; }
}

public class B : A
{
    public double? BA { get; set; }
}

これで、オブジェクトBのインスタンスがある場合、それをタイプAとしてキャストできることがわかりましたが、タイプBオブジェクトとしてインスタンス化するAのインスタンスがあります。すべてのプロパティ値をコピーするコンストラクターをBのクラスに配置できることはわかっていますが、基本クラスAにはかなりの数のプロパティがあり、さらに追加されている可能性があるため、1つが欠落しているか、追加し忘れているのではないかと心配しています。 Aに追加するときにBのコンストラクターに追加します。これを行う簡単な方法はありますか?

- - - -編集 - - -

残念ながら、私のユースケースではなく、皆さんに感謝します。それは、仲間が私に解雇した質問です。私の知る限り、問題があり、彼は基本クラスを変更できません。私が理解しているように、基本クラスはデータベース呼び出しにフックするクラスであり、次にそのデータを取得し、管理者編集画面にいくつかのプロパティを追加して、コードが基本データオブジェクトのプロパティを更新するために使用します。私の最初の反応は、ベースオブジェクトをオブジェクトのプロパティとして持つことでしたが、使用しているツールを使用してベースオブジェクトを「フラット化」する方がはるかに簡単である理由があります。思わなかったこれを行う方法はありましたが、何かが足りない場合に備えて確認したいと思いました-背景を含めるよりも、基本的な質問をする方が簡単だと思いました。水(これで、彼は「彼のコントロールを超えた状況」に苦しんでいるAFAIK)。

4

4 に答える 4

2

すべてのプロパティ値をコピーするコンストラクターをBのクラスに配置できることはわかっていますが、基本クラスAにはかなりの数のプロパティがあり、さらに追加されている可能性があるため、1つが欠落しているか、追加し忘れているのではないかと心配しています。 Aに追加するときにBのコンストラクターに追加します。これを行う簡単な方法はありますか?

通常、これは設計上の欠陥の兆候です。最初にあなたのデザインを再考し、これが本当に必要かどうか、またはここで使用できる別のアプローチがあるかどうかを判断します。そうは言っても...

これを行う簡単な方法はありません。Bインスタンスからインスタンスを作成する必要がある場合Aは、実際に値を新しいインスタンスにコピーする必要があります。

ただし、より良いオプションは、別のインスタンス が与えられた場合に、これらのすべてのプロパティを設定する(潜在的にprotected)コンストラクターを追加することです。次に、これを使用してそれ自体を作成できます。これにより、少なくとも、それらを定義するクラス内のすべてのプロパティに一致するための要件が​​維持されます。これにより、これを長期間維持することが容易になります。AAB

于 2012-09-06T16:21:28.883 に答える
1

他の意見にも同意します。継承ではなく、構成など、別のデザインを使用する方がよいでしょう。

以下に示す構成により、クラスBを変更せずにクラスAを変更できます。

    public class B
    {
        // Constructor
        public B(A A) { this.A = A; }

        // Class A as a read-only property
        public A A { get; private set; }

        // Other properties of class B
        public double? BA { get; set; }
    }
于 2012-09-06T16:49:19.827 に答える
0

逆ポリモーフィズムはc#ではサポートされていません。

于 2012-09-06T16:22:12.353 に答える
0

Reed Copseyが言ったように、これは通常、設計上の欠陥の兆候です。このようなものが必要な場合は、クラス図を作り直します。どこかの継承アーキテクチャで何らかの間違いがあったようです。

必要なのは、子と親の両方が共通のメソッドを実装することだけで、オブジェクトのいずれかが関数に渡されたときに、渡されたオブジェクトのいくつかの共通のメソッドを操作できるようにする場合は、2つに同じものを実装させるだけです。インターフェイス(ポリモーフィズム)、または基本クラスとして関数パラメーターを入力し、メソッドが基本クラスに存在することを確認します。

于 2012-09-06T16:34:45.043 に答える