[英]Porting Multiple Inheritance C++ Code to Java
我創建了一個庫,該庫繼承了另一個用C ++編寫的庫,現在我將該庫移植到Java(C ++最初編寫的原始庫已經存在於Java中)。 在C ++代碼中,有一個純粹的虛擬類稱為Stallable
,應該使用Stallable
,以便在給定電壓輸入增量的情況下向電動機控制器添加失速檢測。 該類包含一個純虛擬方法getVoltage()
,它是幾種不同的電動機控制器類,用於提供電壓源,還提供一些虛擬函數來確定是否存在失速。
類將繼承該類以及原始庫中的一個類(我無法訪問該代碼,並且出於所有意圖和目的,否則將無法對其進行修改),並將實現getVoltage()
,並覆蓋其他任何類他們可能喜歡的方法。 然后,可以僅詢問這些對象是否存在停頓。
當我從Java的角度解決這個問題時,我的處境變得更加棘手。 我仍然無法接觸原始類,因此無法重構代碼,並且仍然允許我庫的用戶Stallable
子類或實現Stallable
但是他們認為合適。
目前,我看到的前景如下。
Stallable
為接口並重新實現其使用的失速檢測邏輯。 為了創建C ++代碼庫具有的原始功能,我必須讓類Stallable
原始庫並實現Stallable
。 這可以工作,但是需要在我要包含的任何子類以及最終用戶要編寫的任何子類中重新實現原始的純虛擬C ++ Stallable
的邏輯。 Stallable
為抽象類,該抽象類包含對原始庫中的電動機控制器類的對象引用。 這保留了C ++代碼中的某些功能,因此某些方法將必須被覆蓋,而某些方法則可以選擇性地被覆蓋,但是此代碼與C ++代碼之間的透明度丟失了。 在C ++中,由於每個子類都是一個Stallable
並且是原始馬達控制器的派生類,因此在需要馬達控制器和需要Stallable
對象時,將指針輕松地指向該對象。 在這種情況下,必須實現某種類型的訪問器函數,該函數將Java引用返回到每個Stallable
子類將保留的原始電動機控制器。 透明度會丟失,但很容易添加停頓檢測。 顯然,如果我可以為各種電機控制器修改原始類,則此問題很容易是重構C ++代碼的問題。
在研究了兩種語言在OOP方面的差異之后,我傾向於選擇選項2,盡管它給最終用戶和計划包括的Stallable
實現帶來了Stallable
。 在開始編寫Stallable.java之前,我一直在問是否還有其他更好的想法或見解。
因此,基本上,您想要的是lib的Java用戶能夠實現接口,並且行為會隨之發生? 這聽起來像是AOP(面向方面的編程)的工作。 使用AOP(例如,AspectJ),您可以將方法注入符合特定條件的類。
在您的情況下,標准是“實現Stallable接口”。 AOP的問題在於它是侵入性的。 如果您選擇進行運行時編織,則用戶將需要使用AOP編譯其類或將AOP添加到其類路徑中。
另一種選擇是嘗試使用動態代理進行一些委派。
最后,您可以嘗試使用字節碼操作http://asm.ow2.org/以便在運行時生成類。
如果您編寫一個有關Java代碼外觀的示例,也許我的答案可能不太明確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.