Вопрос о наследовании Java - Как изменить свойства каждого подкласса, который требуется в супер - PullRequest
3 голосов
/ 22 декабря 2019

Я новичок в Java-наследовании и пытаюсь создать игру.

В этой игре есть абстрактный класс игрового объекта, и я создал класс Enemy, который расширяет его. Теперь я хочу добавить несколько типов врагов, чтобы расширить Enemy. Я пытаюсь найти наиболее эффективный способ сделать это , однако я не могу понять, как дать подклассу final свойства, которые могут использоваться super, если это имеет смысл. Например, , я хочу, чтобы у всех врагов была скорость в направлении X и Y, но я хочу, чтобы у каждого типа врагов была своя собственная.

То, как я сейчас это делаю, в принципе бессмысленно, потому что даже если я создаю FastEnemy, я должен поместить все это в конструктор при создании объекта. Это, наверное, действительно просто, я просто новичок и никогда не сталкивался с этим раньше.

package first.Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;


public class Enemy extends GameObject{

    private Handler handler;
    private Color c; 
    private int eWidth, eHeight, speedX, speedY, x, y;

    public Enemy(int x, int y, int eWidth, int eHeight, int speedX, int speedY, Color c, ID id, Handler handler)
    {
        super(x, y, id);

        this.x = x;
        this.y = y;
        this.id = ID.Enemy;
        this.c = c;
        this.eWidth = eWidth;
        this.eHeight = eHeight;
        this.handler = handler;
        this.speedX = speedX;
        this.speedY = speedY;
    }

    public Rectangle getBounds()
    {
        return new Rectangle(x, y, eWidth, eHeight);
    }

    public void tick()
    {
        x += speedX;
        y += speedY;

        if(y <= 0 || y >= Game.HEIGHT - 48) speedY *= -1; //What can I do instead of 48?
        if(x <= 0 || x >= Game.WIDTH - 32) speedX *= -1;

        handler.addObject(new Trail(x, y, ID.Trail, c, eWidth, eHeight, 0.03f, handler));
    }

    public void render(Graphics g)
    {
        g.setColor(c);
        g.fillRect(x, y, eWidth, eHeight);
    }
}
package first.Game;

import java.awt.Color;

public class FastEnemy extends Enemy{


    public FastEnemy(int x, int y, int eWidth, int eHeight, int speedX, int speedY, Color c, ID id, Handler handler)
    {

        super(x, y, eWidth, eHeight, speedX, speedY, c, id, handler);
    }
}

Ответы [ 2 ]

3 голосов
/ 22 декабря 2019

Из вашего комментария

handler.addObject(new BasicEnemy(r.nextInt(WIDTH - 64), r.nextInt(HEIGHT - 64), 16, 16, 5, 5, Color.red, ID.Enemy, handler)); Это то, что я должен сделать прямо сейчас. Но если мне придется каждый раз давать им все эти размеры ... тогда на самом деле нет разницы между разными типами врагов. Это просто враг, которого я должен менять вручную каждый раз, когда создаю его.

Если значения скорости и размера являются постоянными, а значение зависит от типа врага, его можно поместить всам класс. В качестве параметров вы берете только другие переменные.

public class FastEnemy extends Enemy {

    public FastEnemy(int x, int y, Color c, ID id, Handler handler)
    {

        super(x, y, 16, 16, 5, 5, c, id, handler);
    }
}

Вы также можете инициализировать Color и ID таким же образом (если они являются константами)

2 голосов
/ 22 декабря 2019

Есть много вещей, которые вы можете сделать. Одна вещь, которую вы можете сделать, это сделать любую переменную, которую вы хотите обновить в методе конструктора объектов. Например, в методе конструктора для быстрого врага вы можете обновить скорость до 5, если нормальная скорость примерно равна 3. Кроме того, поскольку методы переопределены, вы можете переопределить метод get для любой переменной, которую вы хотите, и для каждого объекта. возвращает его уникальное значение через метод get.

Я предполагаю, что вы не знаете переопределение метода. Это довольно сложный предмет, но вот основное сокращение: если есть один объект, расширяющий другой объект, если у родительского класса есть один объект, который дочерний класс хочет сделать по-другому, он может просто объявить этот метод в своем собственномКласс со всем таким же, кроме тела метода. Если вы не получили его, вот пример.

Это просто базовый псевдокод, он не совсем соответствует точному синтаксису Java.

class Tree {
    public void print() {
        print "I am a tree"
    }
}

Затем существует другой класс, который расширяет его.

class BirchTree {
    // Note the public void is the same. You can somewhat modify that, but thats a little more complicated.
    public void print() {
        print "I am a birch tree"
    }
}

Итак, другой класс содержит объект Tree, но на самом деле это береза, когда они вызываютМетод print вместо печати «Я дерево» печатает «Я береза».

Если вы не хотите этого, вы можете использовать другой вариант. В методе конструктора вы можете установить для этой переменной все, что захотите.

class Tree extends BiggerTree {
    int height;

    Tree(int height) {
        // If the user created this object expecting it to be something else, then just the parameter.
        height = 10; // If a bigger tree's height is usually 15 or something.
        this.height = height;
    }

Надеюсь, это имело смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...