2012-09-12 30 views
1

我有在C#問題在C#中的繼承

非允許多重繼承的問題以下情形:

class MasterCamera { ... } 

class CameraFromManufacturerA : MasterCamera { ... } 

class CameraFromManufacturerB : MasterCamera { ... } 

class CameraFromManufacturerC : MasterCamera { ... } 

MasterCamera提供了像StartCamera()一些功能,ConnectCamera()等 在我的主要代碼我使用的對象MasterCamera mCamera = CameraSelector.GetCamera();CameraSelector檢查是否連接了A,B或C相機,並返回該對象(例如CameraFromManufacturerA

這工作在理論上完全正常,但這些攝像頭的API的一個需要使用WindowsMessageCallback(WndProc),因此我需要包括該攝像機只有Windows.System.Forms.Form

由於C#不允許多重繼承,據我所知表有沒有接口類,我必須使MasterCamera繼承自Windows.System.Forms.Form

我不想那麼做,所以我該如何解決這個問題?

回答

2

你不應該使用MasterCamera {...}作爲一個類,但用它作爲接口 像:

公共接口MasterCamera {...}

,它必須工作。

+0

謝謝,這工作。不知道你可以使用一個接口作爲一個對象來調用函數。 – SinisterMJ

+2

這不提供實現通用功能的方法。 – GazTheDestroyer

+0

確實如此,但由於每個相機的製造商API完全不同,因此幾乎沒有共同的代碼。 – SinisterMJ

1

如果您只是在你的代碼中依賴而不是。 創建一個Form類,該類覆蓋WindowsMessageCallback並能夠託管MasterCamera對象,該對象將是您需要的那個子類Camera類。

1

您正在嘗試Inheritance。也試試Composition也。

不能Camera包含在Form

2

這是繼承一個共同的問題,這就是爲什麼GoF的國家「在繼承Favor構圖」

你可以使用Strategy pattern。而不是派生不同類型的MasterCamera,而是派生不同類型的ICameraFunctionality,並將該實例的對象存儲在您的MasterCamera(或更確切地說Camera)類中。

這樣MasterCamera只是做普通的工作,但調用它的ICameraFunctionality實例來執行特定的工作。