2017-07-14 4 views
0

Vielleicht eine Newbie Frage, aber ich möchte eine Anwendung schreiben, die Schnittstelle zu mehreren Anbietern Kameras wird. Ich möchte eine Kamera-Klasse schreiben, die die Basisklasse sein werden, so dass in der Runtime ich es zu einem bestimmten Anbieter initialisieren kann:Mehrere Anbieter Kamera-Anwendung

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(); 

Jetzt weiß ich, dass ich es auf diese Weise nicht durch Mehrfachvererbung Beschränkung in C# und ich komme nicht mit der Schnittstelle durch. Wie sollte es richtig gemacht werden?

+0

Was meinen Sie mit "und ich komme nicht mit der Schnittstelle durch"? – Trey

+0

Eigentlich wird die Schnittstelle ein Teil der Lösung sein, wie @maxwe sagte –

Antwort

1

Die Austauschbarkeit für Kameras verschiedener Hersteller kann nur durch die Implementierung einer Schnittstelle ICamera realisiert werden. Beachten Sie, dass Sie beliebig viele Schnittstellen erben können, aber nur von einer Klasse in C#.

Wenn Sie die Implementierung der gemeinsamen Methoden für Kameras teilen möchten, können Sie dies nicht innerhalb einer Schnittstelle tun, aber Sie müssen eine Basisklasse erstellen, die diese Methoden enthält. Da einige Funktionen dieser Basisklasse sich auf den konkreten Anbieter sdk stützen können, können Sie einige Funktionen als abstract deklarieren und sie in der herstellerspezifischen untergeordneten Klasse implementieren. Daher sollten Sie nicht von VendorX_SDK_object und VendorY_SDK_object erben, sondern ruther es zu einem Attribut Ihrer Kindklasse machen.

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(..); 
    } 

}