4

ラップトップとスマートフォンという、まったく異なる機能を持つ2つの基本的な抽象クラスがあるとします。(機能が完全に異なると仮定します)。そして、私の現在のプロジェクトでは、すでにラップトップとスマートフォンの多くの実装があり、それらは常に完全に異なっていました。

しかし、突然、pc-tabletの実装であるクラスを追加するように要求されました。これは、実際にはスマートフォンとラップトップの両方の機能を備えています。基本クラスを変更するには遅すぎます。実際、このPCタブレットは1回だけ表示されると確信しています。

問題は、スマートフォン用のコナイナーにPCタブレットを含めることができるはずですが、継承された機能のためにラップトップでもある必要があります(実際には、プロジェクトの一部では、PCタブレットは次のようにのみ使用されますラップトップであり、スマートフォンの機能は必要ありません。さらに、プロジェクトの特定の部分でスマートフォンとしてpc-tabletを見るのは悪いことです)。だから私はPcTabletAsLaptopを持っています:ラップトップクラス、それは実際にはラップトップであり、スマートフォンではありません。

私の解決策は、ラッパーを追加することです。

class PcTablet : SmartPhone
{
    private PcTabletAsLaptop _pcTablet;

    // Here goes all the methods of PcTabletAsLaptop as proxies:

    public void Call(int number)
    {
      _pcTablet.Call(number);
     }

     // .....
}

200以上のメソッドがあり、それらをPcTabletAsLaptopから自動的に生成したいと思います。

このソリューションは非常に複雑に見えます。私の質問はそれが良いことですか、それともそれを行うためのより簡単な方法がいくつかありますか?

4

3 に答える 3

3

スマートフォンとラップトップの両方からインターフェイスを抽出し、最初の 2 つから継承する 3 番目のインターフェイス PcTablet を作成できます。これにより、PcTablet をスマートフォンまたはラップトップとして使用できるようになります。

編集:

各スマートフォンとラップトップ内のロジックを再利用できるようにするには、アダプター パターンを使用できるため、PcTablet は次のようになります。

public class PcTablet :ISmartPhone, ILaptop
{
     private SmartPhone _smartphone;
     private Laptop _laptop;
     public void ISmartPhone.Call()
     {
         _smartPhone.Call();
         // OR IMPLEMENT THE RIGHT BEHAVIOR 
         //INSTEAD OF CALLING _smartPhone.Call()
     }
}

もちろん、コンストラクターでスマートフォンとラップトップを作成する必要がありますが、それでうまくいくはずです! そうすれば、ラップトップとスマートフォンでコードを再利用できますが、適切なコードが提供されていない場合は動作をオーバーライドすることもできます。

于 2012-06-29T11:03:20.657 に答える
1

多重継承が必要な場合 - ほとんどの場合、何か間違ったことを行っているか、間違った方法で問題を解決しようとしています。以下に示すような階層はどうですか?

internal class PcTabletAslaptop : LaptopBase
{
    // here is you can expose / override laptop specific stuff
}

internal class PcTabletAsSmartphone : SmartphoneBase
{
    // here is you can expose / override smartphone specific stuff
}

public interface IPcTablet
{
   // just expose PcTablet specific API
}

public sealed class PcTablet : IPcTablet
{
   private PcTabletAsSmartphone asSmartphone;
   private PcTabletAsLaptop asLaptop;
}
于 2012-06-29T10:51:00.087 に答える
0

アグリゲーションではなくコンポジションで考えてもいいと思います。

集計と構成

SmartPhoneが含まれているのはどうですかTablet

于 2012-06-29T10:40:21.980 に答える