簡體   English   中英

Java:如何創建可以在包內進行子類化的公共類,同時防止外部人繼承?

[英]Java: How to create a public class that can be subclassed within package, while preventing outsiders from inheriting?

假設我正在寫一個包。 我的包中包含以下繼承層次結構:

public class Container {
    public void size() {
        System.out.println(10);
    }
}

public final class Bucket extends Container {}

public final class Bag extends Container {}

public class Item {
    Container container; // is aware of what container it's in. Will be initialized on construction.
    public Container getContainer() {
        return container;
    } 
}

我想防止其他人將Container子類化。 但我不能讓它final因為BucketBag是子類。 而且我必須將其public ,否則外界無法調用getContainer() 有沒有辦法用Java做到這一點? 否則,人們在這種情況下會做什么?

為了防止某個類被其他包中的類子類化,請使所有構造函數使用package-private

如果該類沒有任何構造函數,則它具有隱式默認構造函數 ,它是public,因此您需要顯式創建一個包私有的無參數構造函數。

package foo;
public class Container {
  Container () {/*package-private*/}
  public void size() { System.out.println(10); }
}

package foo;
public final class Bucket extends Container {}

package bar;
public final class Oops extends Container {}

編譯錯誤:對於默認構造函數,隱式超級構造函數Container()不可見。 必須定義一個顯式構造函數


public final class Oops extends Container {
  public Oops() {}
}

編譯錯誤:隱式超級構造函數Container()不可見。 必須顯式調用另一個構造函數

當然,沒有其他構造函數,因此無法完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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