4

假设我有两个具有完全不同功能的基本抽象类:笔记本电脑和智能手机。(假设功能完全不同)。在我目前的项目中,我已经有很多笔记本电脑和智能手机的实现,而且它们总是完全不同的。

但突然我收到一个请求,要添加一个类,它是 pc-tablet 的实现,它实际上具有智能手机和笔记本电脑的功能。改基类已经来不及了,其实我很确定这个pc-tablet只会出现一次。

问题是,我应该能够将我的 pc-tablet 包含在智能手机的容器中,但它也应该是笔记本电脑,因为继承了功能(实际上除此之外,在项目的某些部分中,pc-tablet 仅用作笔记本电脑,它不需要智能手机功能。此外,将 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

您可以从 SmartPhone 和笔记本电脑中提取一个接口,然后创建第三个接口 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 回答