2015-09-06 31 views
1

我有超類GameObject,它是遊戲中所有對象的超類型。 我想包含所有的創建和管理代碼作爲其中的靜態方法;它應該是唯一能夠使其他對象擴展GameObject的類。 有時我需要創建一個新的對象,其他時候我會列出一些我會從性能方面選擇的對象。在Java中限制創建子類到其父類(或其他)類

有沒有辦法限制孩子的構造函數訪問它的基類,或設計模式來做我想要的?

+0

讓它成爲抽象類。 – SaviNuclear

回答

1

1)使超類摘要

2)寫入一個工廠方法來從超類類型創建子類。

由於基類(超級類)是抽象的,所以子類總是基類類型。

如果在FactoryMethod中有條件,您可以避免。參考我的帖子@Inheritance-aware class to value map to replace series of `instanceof`

SuperClass object = (SuperClass) Class.forName(specificClassName).newInstance(); 
1

使用Java的訪問修飾符有兩種方法:

  1. 封裝父類中的所有子類爲private static嵌套類:

    public abstract class GameObject { 
        private GameObject() { 
        } 
    
        private static class GameObjectImpl1 extends GameObject { 
        } 
    } 
    

由於構造父類是私有的,它不可能在外面擴展。也不可能實例化GameObject,因爲它是抽象的。

這種方法唯一的缺點是你需要把所有的子類直接放在父類中,即文件會很大。

  1. 您可以爲您的基類和它的所有孩子創建單獨的專用包。使基類(GameObject)成爲此包中唯一的公共類。使它的構造函數爲包 - 私有(同一包中的子類仍然可以訪問它)。

    package game; 
    
    public abstract class GameObject { 
        GameObject() { //package-private 
        } 
    
        public static GameObject create() { 
         return new GameObjectImpl1(); 
        } 
    } 
    
    //--------------- 
    package game; 
    
    class GameObjectImpl1 extends GameObject { //package-private 
    } 
    

這種方法的次要缺點是,它可被「黑客」通過與其他源根相同的名稱創建包。那裏的課程將有權訪問game包內的包 - 私人課程。但是,否則這是最乾淨的方法,我建議採取。

0

我知道有兩種方法可能不止於此。

  1. 聲明基類爲Final。
  2. 使基類的構造函數是私有的。