2017-07-14 60 views
0

也許是一個新手問題,但我想寫一個應用程序,將連接到多個供應商的相機。我想寫一個Camera類,這將是基類,以便在運行時我可以初始化給定的供應商:多廠商相機應用程序

public class BaseClass 
{ 
public void Connect(){} 
public void Disconnect(){} 
// common methods for cameras 
} 

public class VendorXCamera: Camera, VendorX_SDK_object 
{} 
public class VendorYCamera: Camera, VendorY_SDK_object 
{} 

BaseClass c_cam; 
//choose Camera X or Y 
c_cam = new VendorXCamera(); 
c_cam.Connect(); 

現在我知道,我不能這樣做,由於多重繼承在C#中的限制,我不會逃避接口。應該如何以正確的方式完成?

+0

你是什麼意思,「我不會脫離接口」? – Trey

+0

其實界面將是@maxwe所說的解決方案的一部分 –

回答

1

不同廠商的相機之間的可互換性可以通過實現一個接口ICamera來實現。請注意,您可以從任意多個接口繼承,但只能從C#中的一個類繼承。

如果你想共享相機的常用方法的實現你不能在一個接口內做到這一點,但你必須創建一個包含這些方法的基類。由於該基類的某些功能可能依賴於具體供應商sdk,因此您可以聲明摘要的某些功能,並在供應商特定的子類中實施它們。因此,您不應該從VendorX_SDK_object和VendorY_SDK_object繼承,但應使其成爲您的子類的屬性。

public interface ICamera{ 
    void Connect(); 
    void Disconnect(); 
} 

abstract class CameraBase:ICamera 
{ 
    protected abstract void OpenStream(); 
    protected abstract void CloseStream(); 

    public void Connect(){ 
     Debug.WriteLine("connecting"); 
     OpenStream(); 
     Debug.WriteLine("connected"); 
    } 
    public void Disconnect(){ 
     Debug.WriteLine("connecting"); 
     CloseStream(); 
     Debug.WriteLine("connected"); 
    } 
} 

class VendorXCamera: CameraBase 
{ 
    private VendorX_SDK_object vendorx_sdk_object; 

    protected override void OpenStream(){ 
     vendorx_sdk_object.OpenStream(..); 
    } 
    protected override void CloseStream(){ 
     vendorx_sdk_object.CloseStream(..); 
    } 

} 

class VendorYCamera: CameraBase 
{ 
    private VendorY_SDK_object vendory_sdk_object; 

    protected override void OpenStream(){ 
     vendory_sdk_object.OpenStream(..); 
    } 
    protected override void CloseStream(){ 
     vendory_sdk_object.CloseStream(..); 
    } 

}