Как использовать метод подкласса «статические поля в суперклассе» при вызове через экземпляр подкласса? - PullRequest
0 голосов
/ 29 января 2019

У меня есть класс модели с подклассом под названием квадратВ модельном классе у меня есть метод draw, которому нужны некоторые поля из подкласса.У меня есть экземпляр подкласса, и я хочу вызвать его функцию рисования (которая не должна быть переопределена в подклассе).

Я пытаюсь сделать что-то, используя openGL на Android, и у меня есть много моделей, которыеиспользовать по существу один и тот же код для рисования, но использовать разные сетки, поэтому иметь разные поля.Я думаю, что немного избыточно копировать функцию рисования в каждый отдельный класс модели, и когда я пытаюсь просто добавить пустые поля в классе модели и поля с тем же именем в подклассе, он использует поля из суперкласса при вызовеметод, использующий экземпляр подкласса, также, передача полей в качестве параметров не является опцией, так как вызов конструктора super должен быть первым вызовом в конструкторе подкласса, и мне нужно применить некоторые операции к полям в подклассе.'конструктор (я думаю, у меня нет опыта работы с ООП, как вы можете сказать).

Многое из следующего является временным, так как я все еще пытаюсь разобраться с вещами

.суперкласс модели:

abstract public class Model {
    static final int COORDS_PER_VERTEX = 3;
    final float Coords[];
    public Model(){
        //do some stuff unrelated to the issue
        }
    public void draw(){
        final int vertexCount = Coords.length / COORDS_PER_VERTEX;
        }
    }

урезанный подкласс модели:

public class Square extends Model{
    private static float Coords[] = {
                -0.5f, 0.5f, 0.0f,   // top left
                -0.5f, -0.5f, 0.0f,   // bottom left
                0.5f, -0.5f, 0.0f,   // bottom right
                0.5f,  0.5f, 0.0f }; // top right
    public Square() {
        super();
        //do something to Coords
        }
    }

вызов метода:

private ArrayList<Model> models = new ArrayList<>();
models.add(new Square());
for (Model model:models) {
        model.draw();
    }

Я ожидаю, что функция draw будет использовать значение 12/3= 4 для vertexCount, но вместо этого возникает ошибка NullPointer, потому что вы не можете использовать .length для нулевого массива.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Потому что наследование не применяется к полям.Ваш код должен выглядеть как

abstract public class Model {
    static final int COORDS_PER_VERTEX = 3;
    public Model(){
        //do some stuff unrelated to the issue
    }
    public void draw(){
        final int vertexCount = getCoords().length / COORDS_PER_VERTEX;
    }
    abstract public float[] getCoords();
}

public class Square extends Model {
    private static float Coords[] = {
                -0.5f, 0.5f, 0.0f,   // top left
                -0.5f, -0.5f, 0.0f,   // bottom left
                0.5f, -0.5f, 0.0f,   // bottom right
                0.5f,  0.5f, 0.0f }; // top right
    public Square() {
        super();
        //do something to Coords
    }

    public float[] getCoords() {
        return Coords;
    }
}

или

abstract public class Model {
    static final int COORDS_PER_VERTEX = 3;
    protected float coords[];

    public Model(float[] coords){
        this.coords = coords;

        //do some stuff unrelated to the issue
    }
    public void draw(){
        final int vertexCount = coords.length / COORDS_PER_VERTEX;
    }
}

public class Square extends Model {
    public Square(){
        super(new float[] {
            -0.5f, 0.5f, 0.0f, 
            -0.5f, -0.5f, 0.0f,
            0.5f, -0.5f, 0.0f, 
            0.5f,  0.5f, 0.0f }
        );
    }
}
0 голосов
/ 29 января 2019

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

abstract public class Model
{

    protected float[] getCoords() {
        return Coords;
    }

}

public class Square extends Model {

    @Override
    protected float[] getCoords() {
        return Coords;
    }

}

Я знаю, что возвращать переменную static экземпляра в методе экземпляра не имеет большого смысла, но вы можете толькопереопределить методы экземпляра.

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