簡體   English   中英

多重繼承和C#

[英]Multiple inheritance and C#

假設我有兩個具有完全不同功能的基本抽象類:筆記本電腦和智能手機。 (假設功能完全不同)。 在我目前的項目中,我已經有很多筆記本電腦和智能手機的實現,而且它們總是完全不同。

但是突然我收到了一個添加一個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和Laptop中提取界面,然后創建將從前兩個繼承的第三個界面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()
     }
}

當然,您必須在構造函數中創建智能手機和筆記本電腦,但它應該可以做到! 這樣,您將能夠重用Laptop&SmartPhone中的代碼,但在他們沒有提供正確的代碼的情況下也會覆蓋他們的行為。

如果您需要多重繼承 - 在大多數情況下,您做錯了或嘗試以錯誤的方式解決問題。 層次結構怎么樣如下所示?

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;
}

我認為你可以考慮組成而不是聚合。

聚合-VS-組合物

SmartPhone包含Tablet怎么樣?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM