Переопределение конструкторов в Java - PullRequest
0 голосов
/ 21 августа 2010

В школе мне нужно изучать Java, и, поскольку я привык к языкам на основе C ++ (например, Cocoa / Objective-C), я очень разочарован в Java.

Я сделал суперкласс(это также можно использовать в качестве базового класса):

public class CellView {
    public CellViewHelper helper; // CellViewHelper is just an example

    public CellView() {
        this.helper = new CellViewHelper();
        this.helper.someVariable = <anything>;

        System.out.println("CellView_constructor");
    }

    public void draw() {
        System.out.println("CellView_draw");
    }

    public void needsRedraw() {
        this.draw();
    }

}

public class ImageCellView extends CellView {

    public Image someImage;

    public ImageCellView() {
        super();
        this.someImage = new Image();
        System.out.println("ImageCellView_constructor");
    }

    public void setSomeParam() {
        this.needsRedraw(); // cannot be replaced by this.draw(); since it's some more complicated.
    }

    @Override public void draw() {
        super.draw();
        System.out.println("ImageCellView_draw");
    }

}

Теперь, когда я называю это так:

ImageCellView imageCellView = new ImageCellView();
imageCellView.setSomeParam();

Я получаю это:

CellView_constructor

ImageCellView_constructor

CellView_draw

Однако я хочу, чтобы оно было:

CellView_constructor

ImageCellView_constructor

CellView_draw

ImageCellView_draw

Как я могу это сделать?

Заранее спасибо,

Тим

РЕДАКТИРОВАТЬ:

Я также реализовал этот метод для CellView:

public void needsRedraw() {
    this.draw();
}

И это для ImageCellView:

public void setSomeParam() {
    this.needsRedraw(); // cannot be replaced by this.draw(); since it's some more complicated.
}

ИЯ звонил так:

ImageCellView imageCellView = new ImageCellView();
imageCellView.setSomeParam();

Это вызывает проблему (когда я вызываю функцию из супер, она вызывает только супер )?Как я могу решить это ... (без необходимости переопределять / переопределять метод needsRedraw () в каждом подклассе?)

Ответы [ 2 ]

2 голосов
/ 21 августа 2010

Вы должны получить правильный вывод.

Я попробовал вам пример только что прокомментированных несвязанных вещей:

import java.awt.Image;

public class CellView {
    //public CellViewHelper helper; // CellViewHelper is just an example

    public CellView() {
        //this.helper = new CellViewHelper();
        //this.helper.someVariable = <anything>;

        System.out.println("CellView_constructor");
    }

    public void draw() {
        System.out.println("CellView_draw");
    }

    public static void main(String[] args) {
        ImageCellView imageCellView = new ImageCellView();
        imageCellView.draw();
    }
}

class ImageCellView extends CellView {

    public Image someImage;

    public ImageCellView() {
        super();
        //this.someImage = new Image();
        System.out.println("ImageCellView_constructor");
    }

    @Override public void draw() {
        super.draw();
        System.out.println("ImageCellView_draw");
    }

}

и я получаю следующий вывод:

CellView_constructor

ImageCellView_constructor

CellView_draw

ImageCellView_draw

Это именно то, что вы хотите, и это то, что печатает ваш код.

1 голос
/ 21 августа 2010

Короткий ответ: «Вы не можете».

Объекты создаются снизу вверх, вызывая инициализаторы базового класса перед инициализаторами подкласса и конструкторами базового класса перед конструкторами подкласса.

РЕДАКТИРОВАТЬ:

Код у вас хорошо выглядит, на основе ваших правок.Я хотел бы выполнить обычные задачи, такие как обеспечение того, чтобы вы скомпилировали свой код после того, как вы добавили System.out.println вызовы в свой подкласс

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