Zadanie Konstruktory, pliki

0

Witam. Mam problem z zadaniem o następującej treści:

Zdefiniuj klasę Kwadrat o polu prywatnym bok typu całkowitego i metodach publicznych:
• konstruktor bez parametrów, który umożliwia utworzenie kwadratu o boku 1
• konstruktor z parametrem(int bok),
• konstruktor kopiujący z parametrem – obiektem klasy Kwadrat,
• metody zwrocBok()
• metodę pole()

Zdefiniuj klasę Prostopadloscian dziedziczącą po klasie Kwadrat i mającą dodatkowo pole wysokość, metodę zwrocWysokosc(), metodę pole() i konstruktory: bez parametrów , który umożliwia utworzenie prostopadłościanu o boku podstawy 1 i wysokości 1, i z parametrami oraz konstruktor z parametrem klasy Prostopadłościan.

Napisz aplikację, w której wczytasz dane z pliku tekstowego - dane czytane do końca pliku. W kolejnych wierszach dane: liczba 1 lub 2 (1- kwadrat, 2-prostopadłoscian), a następnie oddzielone spacjami, w przypadku kwadratu bok zaś w przypadku prostopadłościanu bok i wysokość. Wypisz na ekranie monitora typ figury, parametry charakteryzujące ją i pole powierzchni.

Zastosuj obsługę wyjątków. Zdefiniuj własną klasę Dane dziedzicząca po Exception z dwoma konstruktorami bez parametrów i z parametrem typu String – komunikat. Wykorzystaj tę klasę do obsługi sytuacji wyjątkowych: ujemny lub zerowy bok i ujemna lub zerowa wysokość. Obsłuż błędy IO i błąd złego typu danych.


Mój pierwszy problem napotkałem na tworzeniu konstruktorów w klasie dziedziczącej, bo wydaje mi się że dobrze zostały stworzone w klasie nadrzędnej(Kwadrat).

Kod Kwadrat:

public class Kwadrat {

    private int bok;

    public Kwadrat(){
        bok = 1;
    }

    public Kwadrat(int bok){
        this.bok = bok;
    }

    public Kwadrat(Kwadrat kwadrat){
        bok = kwadrat.bok;                           < - - - - -  dobrze??
    }

    public zwrocBok(){
        return bok;
    }


    public pole(){
        return this.bok*this.bok;
    }

}

Kod Prostopadloscian:

public class Prostopadloscian extends Kwadrat {

    private int wysokosc;

    public Prostopadloscian(){
        bok = 1; ????? jak uzyskać dostęp skoro to jest private czy po prostu to jest tutaj zbędne? 
        wysokosc = 1;
    }

    public Prostopadloscian(int bok, int wysokosc){
        super(bok);
        this.wysokosc = wysokosc;
    }

    public Prostopadloscian(Prostopadloscian prosto){
        ????? w jaki sposób utworzyć ten konstruktor?
    }

}

Proszę również o jakieś wyjaśnienie w jaki sposób i za pomocą czego mam wczytać te dane z pliku i rozwiązać tą cześć zadania odpowiedzialną za pliki. Z góry dziękuję.

0

Hej, to zmieniasz na protected:

private int bok;

Protected, oznacza, że jest widoczne dla tej klasy i dla klas podrzędnych.
Możesz też zrobić setter setbok(int bok) i wywołać go w konstruktorze.
Ale myślę, że rozwiązanie z protected jest bardziej elegancki - raz stworzony kwardat/prostopadłosciannie może zostać zmieniony.

1
    public Prostopadloscian(){
        super(1);
        wysokosc = 1;
    }

    public Prostopadloscian(Prostopadloscian prosto){
        super(prosto.bok);
        this.wysokosc=prosto.wysokosc;
    }
1

Klasa Kwadrat - były błędne sygnatury.

public class Kwadrat {
 
    private int bok;
 
    public Kwadrat(){
        bok = 1;
    }
 
    public Kwadrat(int bok){
        this.bok = bok;
    }
 
    public Kwadrat(Kwadrat kwadrat){
        bok = kwadrat.bok;          
    }
 
    public int zwrocBok(){
        return bok;
    }
    
    public void setBok(int bok){
        this.bok = bok;    
    }
 
    public int pole(){
        return this.bok*this.bok;
    }
 
}

Klasa Prostopadloscian

public class Prostopadloscian extends Kwadrat {
 
    private int wysokosc;
 
    public Prostopadloscian(){
        setBok(1);
        wysokosc = 1;
    }
  
    public Prostopadloscian(Prostopadloscian prosto){
        this.wysokosc = prosto.wysokosc;
        setBok(prosto.zwrocBok());
    }
}

Do czytania z pliku użyj klasy Scanner albo (Java 8) Files.lines(Paths.get(nazwaPliku))...
.

0

@bogdans to normalnie Scannerem w takiej pętli: while (skaner.hasNextLine()) ?

bo struktura pliku ma wyglądać tak:

1 3 - to jest kwadrat bo 1 na początku a 3 to jego bok
2 3 4 - prostopadloscian o boku 3 i wysokosci 4?

Czy to ma być bok=1? I do tego nie trzeba zadnego Tokenizera, by tą spację jakoś przeskoczyć?

1

Bez obsługi błędów:

while(skaner.hasNextLine()){
     String[] items = skaner.nextLine().split(" ");
     if(items[0].equals("1"))
     {
          int bok = Integer.parseInt(items[1]);
          System.out.println("Kwadrat  dlugosc boku = " + bok + " pole powierzchni = " + new Kwadrat(bok).zwrocPole());        
     } 
     ... 
}

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