Tablica: korzystanie z pól klasy bez utworzenia obiektu.

0

Witajcie. Uczę się języka. Analizuję sobie kod gry statki z pewnego kursu. Więc ogólnie jest klasa Field która posiada pola tablicy dwuwymiarowej int x, int y, State stan. I jest taki sobie oto kod. Nie rozumiem dlaczego jest utworzona tablica Field[] occupied = new Field[rozmiar], a później od razu w pętli jest wywoływana metoda z klasy setState bez utworzenia obiektu. Czyli moim zdaniem powinno być occupied[0] = new Field() a dopiero później occupied[0].SetState(przekazuję stan.)

public abstract class WarShip implements Ship {

    enum Orientation {
        HORIZONTAL, VERTICAL
    }

    private Orientation orientation;
    private int hits;
    private Field[] occupied;

    public WarShip() {
        occupied = new Field[getDecksCount()];
    }

    @Override
    public boolean isSunk() {
        return hits == getDecksCount();
    }

    public void setOnField(Field field, int deckNo) {

        field.setShip(this);
        field.setState(State.SHIP);
        occupied[deckNo] = field;
    }

    @Override
    public void hit() {
        hits++;
        if(isSunk()) {
            for (int i = 0; i < occupied.length; i++) {
                occupied[i].setState(State.SUNK);
            }
        }
    }
}

class Submarine extends WarShip {

 
    public int getDecksCount() {
        return 1;
    }
}
1
occupied[deckNo] = field;

Tutaj przypisujesz obiekt pola do tej tablicy

0

A czemu to nie jest przykładowo new field? Czyli zarezerwowanie miejsca na stercie ?

occupied[deckNo] = new field() ?
2

Bo to nie jest pole z powietrza, tylko jakieś konkretne pole leżące na jakiejś konkretnej planszy gry, o którym gra jako taka musi rozumować.
Najprawdopodobniej aby nastąpiło trafienie (hit), trzeba najpierw położyć statek na planszy (setOnField).

2
userned napisał(a):

A czemu to nie jest przykładowo new field? Czyli zarezerwowanie miejsca na stercie ?

occupied[deckNo] = new field() ?

Bo obiekt Field jest już stworzony wcześniej i przekazany do metody. W metodzie setOnField tylko zmieniasz jego właściwości i przypisujesz do tablicy. Nie trzeba go drugi raz tworzyć.

0

Tak, wszystko się zgadza. Dziękuję wam wszystkim.

0

Chciałbym się jeszcze zapytać o konstruktor WarShip. Ktory tworzy tablice? Kiedy jest on wywoływany biorąc pod uwagę że to klasa abstekcyjna? Czy jest wywoływany przez klasy pochodne ? Ale klasy pochodne nie mają zdefiniowanego konstruktora który wywołuje konstruktor klasy bazowej.

2

Więc konstruktor zostanie automagicznie oddziedziczony z klasy bazowej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1