簡體   English   中英

擴展沒有構造函數的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM