Podstawowe zadania z dziedziczenia

0

Witam. Mam takie zadanie do zrobienia z javy. nie jest to nic trudnego ale utknąłem w jednym momencie.
Chodzi o stworzenie tabeli "las" z wcześniej utworzonymi drzewami.
Tresc zadania:

Utwórz klasę Drzewo z polami boolean wiecznieZielone, int wysokosc oraz String
przekrojDrzewa, następnie zaimplementuj konstruktory inicjujące pola i metodę
String toString() wypisującą na konsoli informacje o drzewie.
To jest łatwe:

public class Drzewo {
boolean wiecznieZielone;
int wysokosc;
String przekrojDrzewa;


	Drzewo(boolean wiecznieZielone, int wysokosc, String przekrojDrzewa){
		this.wiecznieZielone = wiecznieZielone;
		this.wysokosc = wysokosc;
		this.przekrojDrzewa = przekrojDrzewa;
	}
	
	public String toString(){
		return  "Informacja czy drzewo jest wiecznie zielone: " + wiecznieZielone + 
				"\nInformacja o wysokości drzewa: " + wysokosc +
				"\nInformacja o przekroju drzewa: " + przekrojDrzewa;
	}
}

Utwórz klasę DrzewoIglaste dziedziczącą po klasie Drzewo, oraz definiująca pola int
iloscIgiel i double dlugscSzyszki. Następnie przygotuj konstruktor inicjujący
wszystkie pola oraz metodę String toString() wypisującą na konsoli informacje o
drzewie wraz z wartościami pól opisujących drzewo iglaste.

public class DrzewoIglaste extends Drzewo{
	int iloscIgiel;
	double dlugscSzyszki;
	
		DrzewoIglaste(boolean wiecznieZielone, int wysokosc, String przekrojDrzewa, int iloscIgiel, double dlugoscSzyszki){
			super(wiecznieZielone, wysokosc, przekrojDrzewa);
			this.iloscIgiel = iloscIgiel;
			this.dlugscSzyszki = dlugoscSzyszki;
		}
		
		public String toString(){
			return  super.toString() +
					"\nInformacja o ilosci igiel: " +iloscIgiel +
					"\nInformacja o dlugisci szyszki: " +dlugscSzyszki;
		}
}

Utwórz klasę DrzewoLisciaste dziedziczącą po klasie Drzewo, oraz definiująca pole
int ksztaltLiscia i metodę String toString() wypisującą na konsoli wszystkie
informacje o drzewie.

public class DrzewoLisciaste extends Drzewo{
	int ksztaltLiscia;
	DrzewoLisciaste(boolean wiecznieZielone, int wysokosc, String przekrojDrzewa, int ksztaltLiscia){
		super(wiecznieZielone, wysokosc, przekrojDrzewa);
		this.ksztaltLiscia = ksztaltLiscia;
	}
	
	public String toString(){
		return  super.toString() +
				"\nInformacja o ksztalcie liscia: " + ksztaltLiscia;
	}
}

Utwórz klasę DrzewoOwocowe dziedziczącą po klasie DrzewoLisciaste, oraz definiująca
pole String nazwaOwoca, podobnie jak w poprzednich zadaniach uzupełnij klasę
o konstruktor i funkcjonalną metodę toString.

public class DrzewoOwocowe extends DrzewoLisciaste{
	String nazwaOwoca;
	
	DrzewoOwocowe(boolean wiecznieZielone, int wysokosc, String przekrojDrzewa, int ksztaltLiscia, String nazwaOwoca){
		super(wiecznieZielone, wysokosc, przekrojDrzewa, ksztaltLiscia);
		this.nazwaOwoca = nazwaOwoca;
		}
	public String toString(){
		return  super.toString() +
				"\nInformacja o owocach: " + nazwaOwoca;
	}
}

I to z czym juz sobie nieporadzilem:
Na koniec utwórz program, który wypełni tablicę Drzewo[] las drzewami takimi
jak: sosny, modrzewie, dęby, osiki, morelowce czy śliwy. Wykorzystując mechanizm
polimorfizmu wyświetl wszystkie informacje o wszystkich drzewach

moje pytanie jak utworzyć ten las?
Zakładam że aby wypełnić ta tablice musze zastosować pętlę która będzie używała konstruktorów. Bo ręczne tworzenie nowego objektu/drzewa w lesie wydaje mi sie pracochłonne i chyba nie o to chodzi w zadaniu.
Może któs coś mi zaproponować?

to co mam do tej pory to:

public class DrzewoTest {

	public static void main(String[] args) {
		Drzewo drzewo = new Drzewo (false, 150, "Poprzeczny");
		DrzewoIglaste drzewoIgl = new DrzewoIglaste (true, 340, "Poprzeczny",14325754,10);
		DrzewoLisciaste drzewolisc = new DrzewoLisciaste (false, 540, "Poprzeczny",10);
		DrzewoOwocowe drzewoOwoc = new DrzewoOwocowe (false, 540, "Poprzeczny",10, "Jabłko");
		Drzewo [] las = new Drzewo[6];

		System.out.print(drzewo.toString());

		
		
	}
}
1

Może jakoś tak:

String[] owoce = {"śliwka", "jabłko", "morela" };
Random r = new Random();
Drzewo[] las = new Drzewo[200];
for(int i = 0; i < las.length; i++)
{
     int rodzaj = r.nextInt(3);
    switch(rodzaj)
    {
        case 0:
            las[i] = new DrzewoOwocowe(false, r.nextInt(300) + 200, ..., ...., owoce[r.nextInt(owoce.length)]);
        break; 
    }
}
0

@bogdans Wielkie dzięki.
Zrobiłem coś takiego:

import java.util.Random;

public class DrzewoTest {

	public static void main(String[] args) {
		
		String[] owoce = {"jabłko","śliwka","gruszka","morela"};
		String[] drzewoIglaste = {"sosna","modrzew","swierk", "limba"};
		String[] drzewoLisciaste = {"dąb","osika", "lipa","brzoza","wierzba"};
		String[] drzewoOwocowe = {"jabłoń","śliwa","grusza","morela"};
		Random r = new Random();
		Drzewo [] las = new Drzewo[200];
		
		for (int i=0;i<las.length;i++){
			int rodzaj = r.nextInt(3);
			switch(rodzaj){
			case 0:
				las[i] = new DrzewoOwocowe(false, r.nextInt(100) + 100, drzewoOwocowe[r.nextInt(drzewoOwocowe.length)], r.nextInt(10), owoce[r.nextInt(owoce.length)]);
				break;
			case 1:
				las[i] = new DrzewoIglaste(true, r.nextInt(500) + 100, drzewoIglaste[r.nextInt(drzewoIglaste.length)], r.nextInt(1000000),r.nextInt(10));
				break;
			case 2:
				las[i] = new DrzewoLisciaste(false, r.nextInt(400) + 200, drzewoLisciaste[r.nextInt(drzewoLisciaste.length)],r.nextInt(10));
				break;
				
			}
		
		}
		for (int i=0;i<las.length;i++){
		System.out.println(las[i]);	
		System.out.println();	
		}
		
	}
}

Tylko jak teraz :"Wykorzystując mechanizm polimorfizmu wyświetlić wszystkie informacje o wszystkich drzewach". Ta pętla na koncu to chyba nie to :).
Polimorfizm - myślałem, że rozumiem to pojęcie, ale chyba jednak nie.
Wydawało mi sie, ze mogę wywołać metode toString() z klasy drzewo która wyświetli mi informacje o drzewach również z klas pochodnych, ale przeciez klasa bazowa nie ma pojecia o istnieniu klas pochodnych.

1

Przecież dla każdego drzewa działa metoda toString() z jego klasy. Obiekt (drzewo) "wie" jakiego jest typu.
A przy okazji, udało Ci się zobrazować powiedzenie o gruszkach na wierzbie.

0

Racja:(
jabłoń ma śliwkę jako owoc. Niezła krzyżówka genetyczna.
Jak to naprawić?

1
            case 0:
                int owoc = r.nextInt(drzewoOwocowe.length);
                las[i] = new DrzewoOwocowe(false, r.nextInt(100) + 100, drzewoOwocowe[owoc], r.nextInt(10), owoce[owoc]);
1

Przy 6-ciu drzewach zrobiłbym to tak:

Drzewo obj[] = { 
  new DrzewoLisciaste(..), 
  new DrzewoLisciaste(...), 
  new DrzewoOwocowe(...)...
};

Przy powiedzmy > 10 można się zastanawiać nad sprytniejszym sposobem - np. najpierw utworzeniem mapy (nazwa -> typ).

Map<String, String> typy Map.of("sosna", "DrzewoIglaste", "dąb", "DrzewoLiściaste");

A potem używasz Class.forName() np. tak:
https://stackoverflow.com/a/6094602

0

Bardzo dziękuję za pomoc w rozwiazaniu zadania. Udalo sie :)
Wasze sugestie co do sposobu rozwiązania bardzo sie przydały. Niestety na początkowych etapach programowania pewne rzeczy wydają sie proste ale podczas ich realizacji zderzam sie ze ścianą. Praktyka, praktyka i jeszcze raz praktyka.
Mam tez spory problem z myśleniem po javowemu. Czytam zadanie i nie wiem jak to przełożyć na klasy i metody chociaż w teorii wiem co one powinny robic. Mam nadzieje ze to przyjdzie z czasem tj. Praktyka :)
Jeszcze raz wielkie dzieki!

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