0

2 つのクラスの選択機能を 3 番目のクラスに使用しようとしています。たとえば、派手なボタンの境界線を作成する Button1 クラスと、テキストをカラフルな形式で書き込む Button2 クラスがあります。現在、これらのクラスは、コードにアクセスできないサードパーティ ベンダーから提供されています。クラスは封印されていないため、継承でき、両方とも基本ボタンクラスから派生しています。

ここで私の要件は、派手な境界線とカラフルなテキストの両方を作成する機能を持つ Button3 クラスという名前の 3 番目のクラスを作成することです。理想的には、両方のクラスから継承し、特定の関数を使用していたでしょう。C# では多重継承がないため、これは不可能です。

この場合、インターフェースが結果を達成するのに役立つことを読んでいました。1 つのクラスで 2 つのクラスの特定の機能を使用する方法を誰かに教えてもらいたいと思います。

4

5 に答える 5

1

他の人が言ったように、アプリケーションが与えられた 2 つの UI クラスから本当に継承する必要がある場合、これを行うことはできません。

UI よりも一般的に、これについて考える必要があります。

  • 完全な継承は、「is-a」のような関係を意味します。ファンシー ボーダー付きのボタンはボタンですが、ファンシー テキスト付きのボタンにすることはできません。

  • インターフェイスは「has-a」関係を定義します。ここでは、「ボタンに派手な境界線を設定する機能」と「ボタンに派手なテキストを設定する機能」があります。これらの用語では、両方の「能力」を同じボタン クラスに適用することを止めるものは何もありません。

したがって、インターフェースを使用すると、集約を行うことができます。と の 2 つのクラスDoerOfThis: IThisを考えますDoerOfThat: IThatDoThisDoThat、集計の両方を行う 3 番目のクラスの何かを作成するには、次のようにします。

public class Something : IThis, IThat
{
  public This DoerOfThis { set; }
  public That DoerOfThat { set; }

  public void DoThis()
  {
     DoerOfThis.DoThis();
  }

  public void DoThat()
  {
     DoerOfThat.DoThat();
  }
}
于 2009-12-31T06:08:30.590 に答える
1

Abstract Factory パターンを使用してみてください。

于 2009-12-31T10:15:47.530 に答える
0

私の意見では、多重継承をシミュレートしたい場合は、継承と組み合わせた構成が機能します。ただし、コントロールを操作する場合、通常は別のコントロール内のコントロールであるため、これは通常オプションではありません。あなたが調べることができるいくつかのオプションは

ユーザー コントロール - winforms ネストされたコントロールを使用している場合 - WPF を使用している場合。

于 2009-12-31T05:58:07.367 に答える
0

C# に複数の継承があったとしても、さまざまなクラスのランダムな部分を取得してそれらを結合することはできません。問題は、それぞれから必要なメソッドがクラス内に存在し、そのクラスの他のメソッドやプライベート ステートと連携して動作する場合にのみ機能することです。あるクラスのメソッドを別のクラスと混ぜ合わせようとすると、内部状態を共有できなくなります。したがって、次に試みるべきことは、封じ込めを使用して内部状態の 2 つのコピーを保持することですが、これはそれらの同期を維持しようとする際の問題につながります。さらに、両方のクラスがペイント メソッドなどにアクセスする必要があります。一緒に作業する代わりに、おそらく互いに戦い、互いの変更をペイントします。これを正しくするのは難しいです。

必要なことは、2 つの Button クラスの 1 つのソース コードを取得し、他の Button クラスのソース コードをインスピレーションとして使用してそれを変更することです (コードを直接使用できる可能性は低いです)。ソース コードへのアクセス権 (または使用する法的権利) がない場合は、残念ながらこの方法では実行できません。

残りのオプションは次のとおりです。

  • Button1 の作成者に連絡して、Button2 から必要な機能を追加するよう依頼してください。
  • Button2 の作成者に連絡して、Button1 から必要な機能を追加するよう依頼してください。
  • 自分で新しいボタン クラスを作成します。
于 2009-12-31T05:52:02.197 に答える
0

インターフェイスはメソッド シグネチャを定義するだけで、メソッド本体は定義しません。インターフェイスを使用してもButton1、まだ動作を取得できないことを意味します。Button2

ベンダーに次のことを依頼できます。

  1. 派手なボタンの境界線とカラフルなテキストに必要なプロパティを定義するインターフェイスを作成する
  2. 上で定義したインターフェイスを使用して、架空のボタンの境界線を描画し、テキストをカラフルな形式で書き込むメソッドを作成します。

次に、両方のインターフェースからあなたを継承button3し、上記のメソッドを呼び出して、必要なことをすべて実行します。

于 2009-12-31T05:54:27.540 に答える