假设我有两个具有完全不同功能的基本抽象类:笔记本电脑和智能手机. (假设功能完全不同).在我目前的项目中,我已经有很多笔记本电脑和智能手机的实现,而且它们总是完全不同. 但是
但是突然我收到了一个添加一个pc-tablet实现的类的请求,它实际上具有智能手机和笔记本电脑的功能.改变基类已经太晚了,实际上我非常确定这款平板电脑只会出现一次.
问题是,我应该可以在智能手机的外壳中包含我的PC平板电脑,但它也应该是笔记本电脑,因为继承的功能(实际上除此之外,在项目的某些部分,pc-tablet仅用作笔记本电脑,它不需要智能手机功能.此外,将PC平板电脑视为项目特定部分的智能手机是不好的.所以我有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自动生成.
这个解决方案看起来很复杂我的问题是好的,或者有一些简单的方法可以做到这一点?
您可以从SmartPhone和EX中提取界面.笔记本电脑然后创建第三个接口PcTablet将继承前两个.这样,您就可以将PcTablet用作智能手机或笔记本电脑.编辑:
为了能够重用每个SmartPhone内部的逻辑和笔记本电脑你可以使用适配器模式,所以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() } }
当然,您必须在构造函数中创建智能手机和笔记本电脑,但它应该可以做到!这样,你就可以重用笔记本电脑中的代码. SmartPhone也会在他们没有提供正确的行为的情况下覆盖他们的行为.