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