java - 在子类中初始化父类(super class)变量(构造函数中需要)

标签 java inheritance constructor subclass superclass

我正在编写一个简单的小行星克隆游戏,使用 Swing 来显示图形。我有点关注 Derek Banas' tutorials , 但决定自己扩展。

最初的想法是游戏中的每个图形元素(即小行星、宇宙飞船和子弹)都扩展了 Polygon 类。他们的构造函数看起来像这样:

public class SpaceShip extends Polygon {

    //x and y coordinates
    public static int[] polyXArray = {...};
    public static int[] polyYArray = {...};

    //other class variables
    {...}

    public SpaceShip() {

        super(polyXArray, polyYArray, polyXArray.length);
    }
}

其他图形元素也是类似的。

编辑:这里的关键元素是两个数组不存储对象的实际坐标,而是它们相对于中心的位置,其坐标是double 类型的类变量。因此,数组仅描述对象的形状,而子类move() 方法将影响中心的坐标。负责实际绘图的类将调用 move() 方法,然后应用仿射变换来移动和旋转形状(根据正确定义的角度参数)。我这样做是为了避免与处理 double 算术相关的精度问题。

现在,由于元素共享许多“相等”变量(它们的中心坐标,我需要用仿射变换来转换它们,它们的速度分量等...)和方法(getter 和 setter,move() 方法等...)我想过让它们成为一个抽象类的扩展 - 比如 GameShape - 它包含所有这些通用方法和变量。 GameShape 现在将是直接扩展 Polygon 的那个:

public abstract class GameShape extends Polygon {

        //x and y coordinates, still unassigned
        public static int[] polyXArray, polyYArray;

        //other class variables
        {...}

        public GameShape() {

            super(polyXArray, polyYArray, polyXArray.length);
        }
}

然后,当我定义不同的子类以便绘制我需要的不同形状时,我想将所需的值分配给 polyXArraypolyYArray,但是我一直无法找到一种方法。

我确实希望这些变量是静态的,因为它们是单个类的特定属性,我不想在每次实例化新对象时都将它们作为参数传递。

我的情况与this question中描述的非常相似,但建议的解决方案似乎不起作用,因为我需要构造函数中的那些变量。有没有办法克服或绕过这个问题?不管程序如何,我的主要目标是拥有一个所有图形元素通用的父类(super class),以避免数十行复制粘贴代码。

最佳答案

您有一对描述特定类型游戏对象形状的数组。如果不同的游戏对象可以有不同的形状,那么它们就不能共享一对数组,就像它们是所有游戏对象类的公共(public)父类(super class)的静态属性一样。相同种类的不同对象可以共享同一对数组(假设不需要在每个对象的基础上修改),这可能对应于那些数组是具体的游戏对象类。然而,在那种情况下,如果您希望这些类的父类(super class)能够访问给定游戏对象的正确形状数据,则必须告知这些形状数据是什么。

主要有两种方法:

  1. 您可以将适当的形状数组传递给父类(super class)的构造函数。你说你不想这样做,但我不明白为什么。

  2. 您可以在子类应该覆盖的父类(super class)上定义访问器方法以提供正确的形状数据(这称为模板方法模式)。

关于java - 在子类中初始化父类(super class)变量(构造函数中需要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002225/

相关文章:

java - 将整数传递给其他 Activity 会导致奇怪的行为

Java Criteria 查询金额范围,无论金额符号如何

CSS 继承、别名和其他很酷的东西

c++ - 声明的含义是什么,例如无效a(字符串b = 0)

线程主 java.util.no such 元素中的 JAVA 异常

java - 当我运行此 JFrame 时,为什么我的按钮不会出现?

c++ - 继承抽象基接口(interface)及其实现给出 C2259

python - 类继承自同一个类

构造函数实例变量 Pharo

java - 使用构造函数的参数作为全局变量