[英]Extend a class who has no constructor
我有一個無法修改的外部類,我想向與我的項目相關的類中添加自定義功能,因此我創建了一個類,對該類進行了擴展,以添加所需的其他方法。
問題是Car類沒有構造函數,所以我不能使用super,創建Car對象的唯一方法是通過返回完全填充的Car對象的本機方法。
public class Car {
//The only way to create a car
public native Car readFromFile (String file);
//Many other variables and methods
}
和我的自定義類:
import com.example.Car;
public class CustomCar extends Car {
public void extraMethod1(){
//do something using Car variables
}
}
顯然,由於具有ClassCastException,我無法轉換為(CustomCar),那么如何從該本機方法獲取Car並在該對象上使用CustomCar的方法?
我是否應該在CustomCar中僅具有一個變量Car並在CustomCar方法中使用它?
import com.example.Car;
public class CustomCar {
Car car;
public void extraMethod1(){
car.doSomething(); //do something using Car variables
}
}
還是我應該創建一個復制所有父變量的新構造函數?
非常感謝您的幫助!
我懷疑您的問題可能基於誤解。 您的示例類Car
具有一個默認的構造函數,等效於編寫以下代碼:
public Car() { }
當且僅當類未聲明任何顯式構造函數時,才添加默認構造函數。
如果將CustomCar
聲明為Car
的子類,則可以使用默認的Car
構造函數。
第二個問題是您已將readFromFile
聲明為
public native Car readFromFile (String file);
它一定要是
public static native Car readFromFile (String file);
可用。 (如果readFromFile
確實是一個實例方法,並且readFromFile
是創建Car
實例的唯一方法,那么您將遇到引導問題。如何創建第一個Car
?)
話雖如此,如果您的Car
類的默認構造函數不起作用(即,它無法正確初始化Car
的狀態),那么您就會遇到問題:
如果CustomCar(...)
僅使用Car()
,那么將無法正確初始化超類。
如果將其分類為Car.readFromFile()
則結果將是一個新對象,即Car
而不是CustomCar
。
可能有一些方法可以解決此問題。 例如:
您可以向Car
添加一個顯式構造函數,以執行必要的初始化。
您可以將CustomCar
用作CustomCar
使用本機Car
方法實例化的真實Car
實例的包裝。 然后讓CustomCar
實現委托給包裝實例。 如果沒有其他問題,則應該可以使CustomCar
成為Car
的子類型。
哪種方法更好? 這很難說。 這取決於您的實際用例的細節。 例如,通過本機方法創建的對象是否具有隱藏狀態或特殊的“身份相關”屬性? (為什么要使用本機代碼創建它?)
如果有理由無法解決這些問題,則您有問題。 Car::readFromFile
無法成為任何Car
子類所需的構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.