Problem ze zrozumieniem dziedziczenia metod

0

Cześć, od niedawna uczę się javy i nie potrafię zrozumieć jak działa poniższy program
https://hyperskill.org/learn/step/3063#comment

Dlaczego wynik to 38, a nie 55? Według mnie klasa MagicNumberGenerator powinna odziedziczyć funkcję generate() z klasy NumberGenerator. W takim wypadku generator.generate() powinno zwrócić super.generate() + getNumber() w klasie MagicNumberGenerator, co jest równe getNumber() (17) + super.generate() + getNumber() z klasy NumberGenerator co jest równe kolejne 17 z getNumber() i w końcu + generate() z BaseNumberGenerator (21) czyli razem 55. Sprawdzałem debuggerem i wywołanie generator.generate() wywołuje funkcje generate() z klasy NumberGenerator. Dlaczego nie wywołuje tej funkcji w klasie MagicNumberGenerator w której ta funkcja NIE była nadpisana, ale powinna być odziedziczona z klasy NumberGenerator? Jeśli nadpiszę funckję generate() w klasie MagicNumberGenerator to stanie się tak jak myślałem, że powinno się stać nawet bez nadpisywania tej metody (wynik 55). Dlaczego ta funkcja jest uruchamiana z klasy NumberGenerator jeśli jej nie nadpiszemy w MagicNumberGenerator?

Edit: czy jeśli funkcja jest dziedziczona, ale nie nadpisana to jej egzekucja tak jakby wykona się w superklasie, a nie zostanie "przekopiowana" do subklasy?

2

Dlaczego wynik to 38, a nie 55?

super.generate() zwraca base+11 czyli 10+11
getNumber() w magicznej klasie zwraca base+7 czyli 10+7
super.generate() + getNumber() to będzie 10+11+10+7 = 38

Nie wiem skąd ty tam bierzesz jakiś dodatkowy call.

Według mnie klasa MagicNumberGenerator powinna odziedziczyć funkcję generate() z klasy NumberGenerator

I tak właśnie jest, inaczej nie mógłbyś jej w ogóle zawołać przecież.

W takim wypadku generator.generate() powinno zwrócić super.generate() + getNumber()

I dokładnie to ma miejsce.

co jest równe getNumber() (17) + super.generate() + getNumber() z klasy NumberGenerator co jest równe kolejne 17 z getNumber() i w końcu + generate() z BaseNumberGenerator (21) czyli razem 55

Nie mam pojęcia skąd to wytrzasnąłeś. Tobie się chyba wydaje że to sie jakoś magicznie kaskadowo "samo woła" a nic takiego nie ma miejsca. Nic się tutaj "samo" nie woła. Jedyne wywołania funkcji są te które są "jawne".

Wołasz w kodzie generator.generate() z magicznej klasy który wykonuje super.generate() + getNumber(). Funkcja super.generate() w nadklasie robi base + 11 a funkcja getNumber() robi base + 7.

0

@Shalom:

Nie rozumiem tego, że jeśli MagicNumberGenerator dziedziczy funkcję generate() z klasy NumberGenerator, to czemu generator.generate() wywołuje tę funkcję tak jakby w klasie NumberGenerator. Bo gdyby nadpisać funkcję generate() w klasie MagicNumberGenerator to rezulatem będzie 55 bo wynikiem będzie getNumber() (17) + super(generate) czyli funkcja generate() z klasy MagicGenerator gdzie ponownie mamy getNumber() (17) i znowu odwołanie super(generate) do funkcji generate z klasy BaseNumberGenerator (21). I dlatego zastanawia mnie w jaki sposób to dziedziczenie metod działa. Jeśli klasa MagicNumberGenerator odziedziczyła funkcję generate() z NumberGenerator to wywołanie jej na obiekcie MagicNumberGenerator odwoła go od razu do klasy NumberGenerator, tam gdzie została po raz ostatni nadpisana? Wcześniej myślałem ze odziedziczenie tej metody będzie równoznaczne z nadpisaniem jej w niezmienionej formie w subklasie, ale wygląda na to, że jeśli nie jest nadpisana to funkcja wywoła się klasę wyżej (NumberGenerator)?

2

czemu generator.generate() wywołuje tę funkcję tak jakby w klasie NumberGenerator

Co to za bzdura? o_O Jak wywołał ja z klasy NumberGenerator to przeciez wynikiem byłoby base + 11 i zadnego getNumber() nikt by nie zawołał.

Ale chyba powoli rozumiem co ty chcesz przekazać. Tobie się wydaje że dziedziczenie sprawia że tak jakby kod jest skopiowany do podklasy i wg ciebie w takim razie super.generate() skopiowane do MagicNumberGenerator powinno użyć super którym jest NumberGenerator a nie BaseNumberGenerator. Jest to założenie błędne, nic takiego nie ma miejsca. Ta odziedziczona metoda działa tak samo jak dla nadklasy, czyli super odnosi się do nadklasy względem tej z której odziedziczono dana metodę.

0

@Shalom: Wszystko jasne, właśnie o to mi chodziło, dzięki :)

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