有如下結構的代碼:
其中Parent的ApplyEditable是一個Virtual方法,Child要對其進行各自不同的實現,即重寫ApplyEditable方法。
上述代碼中,很明顯ParentA和ParentB有重復代碼。但是由於C#不支持多繼承,所以無法使用多繼承的方式把這些重復代碼封裝起來。
我們只有走變通的道路:經過我的實踐,使用混合+接口的方式。可以比較好的實現多繼承。
我們還是直接來看圖:
具體的解決步驟是:
把之前在ParentA和ParentB中公共的代碼封裝到BaseC中,並作為Parent的一個屬性。
把需要重寫的方法ApplyEditable定義到一個接口IBaseCAction中。(實際上,如果只有一個方法需要重寫的話,可以不用定義接口,直接在BaseC中定義一個Action的委托變量就可以了。當然定義接口更方便支持多個重寫方法。)
讓ChildA和ChildB實現IBaseCAction接口,並分別實現ApplyEditable的不同代碼。
在Child類的構造器中,把自己傳給BaseC的實例化,即this.BaseC = new BaseC(this);