dziedziczenie a obiekty

0

Witam wszystkich,

Chodzi o to, że mam pięć klas: A, B, C, D, main
Klasa A jest klasa bazowa
Klasa B dziedziczy po A (class B extends A)
Klasa C dziedziczy po B
Klasa D dziedziczy po B
Klasa main nic nie dziedziczy.
Wszystkie sa w tym samym package

W klasie A znajduje sie jakas_funkcja(int parametr1, ... , parametrN) gdzie N jest liczba naturalna
W klasie B znajduje sie jakas_funkcja(int parametr1, ... , parametrN , parametrN+1)

w main tworze tablice obiektów w sposób taki.

 
A[] tablica_obiektow = new A[5];
tablica_obiektow[0] = new C();
tablica_obiektow[1] = new C();
tablica_obiektow[2] = new D();
tablica_obiektow[3] = new C();
tablica_obiektow[4] = new D();

i teraz gdy odwoluje sie w sposob taki, że

tablica_obiektow[0].

to po kropce widze (w podpowiadajce) tylko metody klasy A, a ja potrzebuje wlasnie metode klasy B ktora ma parametrN+1

W jaki sposób (tworząc obiekty klasy A) odwołać się do metod klasy B?

starałem się wyjaśnić jak najlepiej potrafiłem.

0

Musisz użyć rzutowania:
B b = (B)tablica_obiektow[xxx];
Pod warunkiem, że tablica_obiektow[xxx] rzeczywiście jest instancją klasy B.

0

rzeczywiście tak działa, ale czy nie da się jakoś właśnie bezpośrednio z tej tablicy?

potrzebuje mieć wszystkie obiekty w takiej tablicy, żebym mógł łatwo coś znaleźć w tych obiektach. Bo dla pięciu elementów to nie jest dużo roboty, ale powiedzmy dla 100?

mam coś takiego. Kryteria są w enumie

 public int wyszukiwanie_pracownika(Pracownik_uczelni[] pracownicy, 
			String im_naz_stan_PE, kryteriaSzukania kryteria){
		int pozycja = -1;
		
		for (int i = 0 ; i < pracownicy.length ; i++){
			
			switch(kryteria){
			case IMIE:
				if (pracownicy[i].getImie() == im_naz_stan_PE) pozycja = i;
				break;
			case NAZWISKO:
				if (pracownicy[i].getNazwisko() == im_naz_stan_PE) pozycja = i;
				break;
			case STANOWISKO:
				if (pracownicy[i].getStanowisko() == im_naz_stan_PE) pozycja = i;
				break;
			case PESEL:
				if (pracownicy[i].getPESEL() == im_naz_stan_PE) pozycja = i;
				break;
			default:
				System.out.println("Zle kryteria!");
			}
		}
		
		return pozycja;
	}

dzięki tablicy łatwo mogę daną (jedną) pozycję która mnie interesuje wyszukać. Tylko niestety nie widzi mi tej metody (jest w klasie B tak jakby)

1

Możesz klasę A zrobić abstrakcyjną. Musisz do niej dodać metody, które są implementowane w klasach B, C i D, ale zostaną one puste. Stąd bez rzutowania będziesz mógł je wykorzystać. Tak po prostu się nie da, więc coś za coś. Możesz jeszcze zrobić coś bardziej złożonego, a mianowicie brać obiekt z tablicy, sprawdzać jakiej on jest klasy i w zależności od tego za pomocą refleksji wywołać taką metodę, o której wiesz, że tam jest. Dość to złożone i zapewne mniej wydajne, ale pozwoli na zachowanie klas dokładnie takimi jakie są. Ja bym wybrał pierwsze rozwiązanie (klasę abstrakcyjną).

1

A nie możesz zrobić tablicy B[]? Zamiast kombinować, może zastanów się, czy taka hierarchia na pewno ma sens, opisz dokładniej problem.
I Stringi porównuje się poprzez equals, nie ==.

0

Muszą być cztery klasy dziedziczone w ten sposób jaki opisałem. Jest to zadanie na studia.
chodnik, jeżeli użyje polimorfizmu to na pewno będzie działać, ale chciałem tak tego nie robić (nie było jeszcze o tym na zajęciach) ale widać zmuszony jestem :)
dziękuje za equals iooi.

0
chodnik napisał(a)

Tak po prostu się nie da, więc coś za coś. Możesz jeszcze zrobić coś bardziej złożonego, a mianowicie brać obiekt z tablicy, sprawdzać jakiej on jest klasy i w zależności od tego za pomocą refleksji wywołać taką metodę, o której wiesz, że tam jest.

To Java jest aż tak prostacka, że nie wystarczy rzutować na klasę dziedziczącą i wywołać metodę, trzeba od razu używać refleksji?

0

Wystarczy, ale autor z jakichś przyczyn nie chce tego robić ;)

0

okazało się, że źle zrozumiałem zadanie. Miałem stworzyć tablice obiektów B. Więc wystarczyło przerobić jedna linijkę i wszystko działa jak powinno :) bardzo dziekuję

0
somekind napisał(a)

To Java jest aż tak prostacka, że nie wystarczy rzutować na klasę dziedziczącą i wywołać metodę, trzeba od razu używać refleksji?

Nie jest aż tak prostacka, można zrobić rzutowanie, kilka postów wyżej jest przykład jak to zrobić. Pisząc, że po prostu się nie da miałem na myśli, że nie da się bez rzutowania. O tym jaka jest jawa właśnie toczy się dyskusja w tym wątku: http://4programmers.net/Forum/Java/189524-wytlumaczcie_mi_ten_porzadek. To taki off-topic (dawniej: na maginesie).

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