Problem początkującego z zadaniem

0

Cześć

Mam zadanie, które sprawia mi duże problemy. Spróbuje opisać z czym się zmagam, uczę się dopiero jezyka javy, więc prosiłbym o wskazówki.i wyrozumiałość
Stwórzyłem klasy:

  • zwierze, która ma imię, wiek i może dać głos
  • pies, która ma rasę i daje głos.
  • lis, która ma kolor i daje głos
  • kot, która ma umaszczenie i daje głos

Mam kilka probłemów:

  1. Jak znaleŹć zwierze które jest najstarsze??
  2. Mam kłopot z tym, że nie wiem jak sobie poradzić by zabiezpieczyć klasę zwierzę aby nie dało sie stworzyć zwierzęcia z wiekiem ujemnym, a jeśli jest wiek ujemny to niech rzuci wyjatkiem InvalidAnimalAgeException, przeprowadzić tutaj symulacje z trycatch i pokazać przechwycenie wyjatku i jego obsluge.
  3. Rasy psa powinny byc typem wyliczeniowym, dostepne sa rasy Psa: Jork, Jamnik, Wilk.

Póki co stworzyłem wymienione klasy czyli zwierze, pies, lis, kot i klasę Main, a dalej utknąłem. Proszę o wskazówki bardziej doświadczonych Kolegów.

   public class Zwierze {

    private String imie;
    private int wiek;

    public Zwierze(String imie, int wiek) {
        this.imie = imie;
        this.wiek = wiek;
    }

    public String getImie() {
        return imie;
    }

    public void setImie(String imie) {
        this.imie = imie;
    }

    public int getWiek() {
        return wiek;
    }

    public void setWiek(int wiek) {
        this.wiek = wiek;
    }

    public void dajGlos(){
            System.out.println("Daj głos");

        }

    @Override
    public String toString() {
        return "Zwierze{" +
                "imie='" + imie + '\'' +
                ", wiek=" + wiek +
                '}';
    }
}

public class Kot extends Zwierze{

    private String umaszczenie;

    public Kot(String imie, int wiek) {
        super(imie, wiek);
    }

    public void dajGlos() {
        super.dajGlos();
        System.out.println("miau miau");
    }

    @Override
    public String toString() {
        return super.toString()+ ", umaszczenie=" + umaszczenie;
    }

public class Pies extends Zwierze{

    private String rasa;

    public Pies(String imie, int wiek) {
        super(imie, wiek);
    }

    public void dajGlos() {
        super.dajGlos();
        System.out.println("hau hau");
    }

    @Override
    public String toString() {
        return super.toString()+ ", rasa=" + rasa;
    }
}


public class Lis extends Zwierze{

    private String kolor;

    public Lis(String imie, int wiek) {
        super(imie, wiek);
    }

    public void dajGlos() {
        super.dajGlos();
        System.out.println("lititititit");
    }

    @Override
    public String toString() {
        return super.toString()+ ", kolor=" + kolor;
    }
}
1

Chyba faktycznie kolos ale na uczelni :)

Ad.1) Stwórz listę (albo inną kolekcję np. zbiór) sparametryzowaną typem Twojej klasy bazowej, przeiteruj po niej to znajdziesz najmniejszą wartość (możesz też użyć strumieni).
Ad.2) Możesz to zrobić po prostu w konstruktorze.
Ad.3) Ma być enum a w klasie Pies rasę zadeklarowałeś jako String. Czemu? Stwórz enuma i typ pola ustaw jako ten typ wyliczeniowy zamiast stringa.

1

Jak znaleŹć zwierze które jest najstarsze??

Prawdopodobnie chodzi tutaj o stworzenie kilku obiektów, zapisanie ich np. w tablicy a następnie np. pętlą for sprawdzenie których z nich ma najwiekszy wiek (getWiek())
Miałeś takie rzeczy? (obiekt, tablica, pętla)

0

@RequiredNickname: ad3. stworzyłem nową klasę enum, która nazywa się RasyPsa i tam podałęm kilka ras. Dodałęm też prywatnego stringa o nazwie skrót.
Jeśli dobrze rozumiem to ma teraz w klasie Pies dodać enum RasyPsa??

0

`Tak teraz wygląda klasa Pies i enum Rasy Psa

``

public class Pies extends Zwierze{

private RasyPsa rasyPsa;

public Pies(String imie, int wiek, RasyPsa rasyPsa) {
    super(imie, wiek);
    this.rasyPsa = rasyPsa;
}

public Pies(String imie, int wiek) {
    super(imie, wiek);
}

public void dajGlos() {
    super.dajGlos();
    System.out.println("hau hau");
}

@Override
public String toString() {
    return super.toString()+ ", rasyPsa=" + rasyPsa;
}

public enum RasyPsa {

SAMOYED("Samo"),
JORK("Jork"),
JAMNIK("Jam"),
WILK("W"),

private String skrót;

RasyPsa(String skrót) { this.skrót = skrót; }

public String getSkrót() {return skrót;}

```
1

Dobrze ci idzie, możesz teraz usunąć ten konstruktor aby nie móc stworzyć psa który nie ma rasy

public Pies(String imie, int wiek) {
    super(imie, wiek);
}

powinieneś teraz dodać do konstruktora sprawdzenie podanego wieku Zwierzaka i rzucenie wyjątku

0

w klasie Main dodałęm zwierzaki ale właśnie jak znaleźć najstarsze zwierzę i zabiezpieczyć klasę Zwierzę??



     public static void main(String[] args) {

        Lis lis = new Lis("lis", 4);
        Kaczka kaczka = new Kaczka("kaczka", 3);
        Kot kot = new Kot("kot", 9);
        Pies pies = new Pies("pies", 33);

        Zwierze[] zwierzes = new Zwierze[4];
        zwierzes[0] = lis;
        zwierzes[1] = kaczka;
        zwierzes[2] = kot;
        zwierzes[3] = pies;
        for (Zwierze v : zwierzes) {
            v.dajGlos();
1

Najwyższy wiek to tylko przypisujesz pierwszy wiek z listy do jakiejś zmiennej i w pętli sprawdzasz czy wiek jest wyższy od tego który jest w tej zmiennej

Zwierze[] zwierzes = new Zwierze[4];
zwierzes[0] = lis;
zwierzes[1] = kaczka;
zwierzes[2] = kot;
zwierzes[3] = pies;

int highestAge = zwierzes[0].wiek;

foreach (Zwierze v : zwierzes) {
    v.dajGlos();
    if (v.wiek > highestAge)
    {
        highestAge = v.wiek;
    }
}
0

dzięki @pavarotti poradziłem sobie z tym późną nocą. Dodałem tez metodę toString do każdej klasy, która wypisuje wszystkie parametry danego zwierzaka, ładniejsze dla oka:).

Nie potrafię rozgryźć zagadnienia z zabezpieczeniem klasy zwierze aby nie dało się stworzyć zwierzęcia z ujemnym wiekiem. A dalej pokazać symulację trycatch i przechwycenie wyjatku i jakas jego obsluge.

Panowie macie jakieś wskazówki? Jak wyglądałby taki kod??

0

Albo deklarujesz typ zmiennej uint i wtedy z automatu nie może mieć ujemnych - dobra wyczytałem że w Javie nie ma unsigned intów.
W takim razie sprawdzasz ifem czy nie jest ujemna:

if (age >=0)
{
    //do something
}

Albo robisz pętlę która się wykona dopiero jeśli liczba będzie >= 0:

do
{
    int age = int.Parse(Console.ReadLine());
} while (age >= 0);

Możesz napisać metodę:

public bool IsPosivite(int number)
    => number >= 0;

i gdzieś to potem sprawdzać.
A no i ja w C# Ci daje rozwiązanie, Ty musisz to napisać tak jak Ci pasuje.

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