Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将子类的创建限制为其父(或其他)类_Java - Fatal编程技术网

在Java中将子类的创建限制为其父(或其他)类

在Java中将子类的创建限制为其父(或其他)类,java,Java,我有一个超类游戏对象,它是游戏中所有对象的超类型。 我想将所有创建和管理代码作为静态方法包含在其中;它应该是唯一一个能够生成扩展GameObject的其他对象的类。 有时,我需要创建一个新对象,有时,出于性能原因,我会从中选择一个对象列表 有没有一种方法可以限制子构造函数对其基类的访问,或者有一种设计模式来实现我想要的功能?1)将超类抽象化 2) 编写一个工厂方法从超类类型创建子类 因为基类(超类)是抽象的,所以子类总是基类类型 您可以在FactoryMethod中避免if条件。请参阅我的帖子@

我有一个超类游戏对象,它是游戏中所有对象的超类型。 我想将所有创建和管理代码作为静态方法包含在其中;它应该是唯一一个能够生成扩展GameObject的其他对象的类。 有时,我需要创建一个新对象,有时,出于性能原因,我会从中选择一个对象列表

有没有一种方法可以限制子构造函数对其基类的访问,或者有一种设计模式来实现我想要的功能?

1)将超类抽象化

2) 编写一个工厂方法从超类类型创建子类

因为基类(超类)是抽象的,所以子类总是基类类型

您可以在FactoryMethod中避免if条件。请参阅我的帖子@

e、 g


使用Java的访问修饰符,您有两种方法:

  • 将父类中的所有子类封装为
    private static
    嵌套类:

    public abstract class GameObject {
        private GameObject() {
        }
    
        private static class GameObjectImpl1 extends GameObject {
        }
    }
    
  • 由于父类的构造函数是私有的,所以不可能将其扩展到外部。此外,由于游戏对象是抽象的,因此无法实例化
    GameObject

    这种方法唯一的缺点是,您需要将所有子类都放在父类中,即文件会很大

  • 您可以为基类及其所有子类创建单独的专用包。使基类(
    GameObject
    )成为此包中唯一的公共类。使它的构造函数包私有(同一个包中的子类仍然可以访问它)


  • 这种方法的一个小缺点是,可以通过在其他源根目录中创建具有相同名称的包来对其进行“黑客攻击”。那里的类可以访问
    游戏
    包中的包私有类。然而,否则这是最干净的方法,我建议您采用。

    我知道有两种方法可能不止这些

  • 声明基类为Final
  • 使基类的构造函数是私有的

  • 让它成为抽象类。
    public abstract class GameObject {
        private GameObject() {
        }
    
        private static class GameObjectImpl1 extends 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
    }