也许是一个新手问题,但我想编写一个与多个供应商相机接口的应用程序。我想编写一个将成为基类的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 :(得分:1)
通过实现接口ICamera,可以实现不同供应商的相机的可交换性。请注意,您可以从任意多个接口继承,但只能从C#中的一个类继承。
如果您想共享相机常用方法的实现,则无法在界面中执行此操作,但您必须创建包含此方法的基类。由于该基类的某些功能可能依赖于具体的供应商sdk,因此您可以将某些函数声明为 abstract ,并在特定于供应商的子类中实现它们。因此,您不应该继承VendorX_SDK_object和VendorY_SDK_object,但是ruther会将其作为您子类的属性。
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(..);
}
}