Java-Overving & Polymorfisme

Status
Niet open voor verdere reacties.

jokertoxic

Gebruiker
Lid geworden
17 dec 2005
Berichten
25
yeet allemaal!!

ik heb een vraagje ivm het overvings-en polymorfisme principe mijn probleem is het volgende:

KlasseDiagram:



Persoon student = new Student("tom");
Persoon docent = new Docent("patric");

Persoon is mijn superklasse, Student en Docent zijn de subklassen die voorzien zijn van de volgende methode:

public String getNaam(){
return naam;
}

als ik het volgende doe:

student.getNaam();
docent.getNaam();

werkt dit niet omdat het type van student en docent eigenlijk Persoon is en Persoon heeft geen methode getNaam() en daar wringt bij mij het schoentje!

1. wat is nu het voordeel van Polymorfisme?
2. als ik in Persoon de getNaam() methode schrijf dan werkt het wel terwijl het principe van overerving , bestaande code uit te breiden in de subklassen is maar dat zou niet werken want de superklasse kent deze methoden dan niet en dan kan je nooit die extra methoden aanroepen. dit alles kan ik wel oplossen door te gaan casten naar juiste type maar dan komen we terug bij punt 1 wat is dan het voordeel van polymorfisme?

heet mischien iemand hier een uitleg voor?
Alvast bedankt!:)
 
Laatst bewerkt:
Het voordeel van polymorfisme lijkt mij dat als je twee dezelfde methodes hebt, zoals je twee keer getNaam() hebt, dan hoef je die maar één keer te schrijven, en dat in je hoofdklasse. Zo hoef je niet dezelfde code in allebei de subklassen te schrijven...

In de superklasse Persoon maak je dus de methodes die Student en Docent gelijk hebben, zoals getNaam(), getVoornaam(), getAdres() (als voorbeeld) en in de subklassen maak je dan de methodes die specifiek zijn voor Docent en Student. Zoals bijvoorbeeld getGemiddeldePunten() of getDocenten() voor Student... En dan bij Docent kun je specifieke methodes hebben die dan weer niet bij Student passen als: getStudenten() of getVakGebied()

Ik hoop dat het wat duidelijk is voor je.

Mvg Nicholas
 
ja maar dan kan je die specifieke methodes toch niet aanroepen?
Persoon stud = new Student("naam");

stud.getDocenten(); zal niet werken tenzij ik hem cast naar een Student terwijl ik stud als volgt heb gedefineert
stud = new Student("naam"); dus java zou toch automatisch moeten weten dat dit een Student is....

kan je me beetje volgen?:p
dus mijn conclusie is dat polymorfisme totaal geen zin heeft als ik zou zeggen Student stud = new Student("naam"); dan kan ik alle methoden aanroepen zonder casten etc...
 
Ja, soms lijkt het niet echt nuttig, maar naarmate je uitbreidt wordt het vaak erg handig. Je moet er ook wat gewend aan raken en uiteindelijk blijkt het erg handig te zijn. In bijlage heb ik een project gestoken waarin je een voorbeeld ziet van waarin overerving erg handig is.

Je moet er maar eens naar kijken.


Mvg Nicholas
 

Bijlagen

Laatst bewerkt:
En vergeet ook niet dat je al de methodes die in Persoon dan staan, voor beide heel gemakkelijk kan gebruiken, wat een heel groot voordeel oplevert! Want zo hoef je alle methodes die ze gemeen hebben maar 1 keer te schrijven. Zo krijg je geen gedupliceerde code in je project.
 
Zo krijg je geen gedupliceerde code in je project.

Dat vind ik ook het grote voordeel ervan. Je hoeft dan niet code te "copy-pasten" in beide subklasses, maar kan de methode gewoon in de superklasse maken en deze in de subklasses aanroepen, maar ik val nu in herhaling dat zei tranceftw ook al :), het is dan ook handig in gevallen waarin 2 klasses veel gelijkenissen hebben.
 
Laatst bewerkt:
ja maar dan kan je die specifieke methodes toch niet aanroepen?
Persoon stud = new Student("naam");

stud.getDocenten(); zal niet werken tenzij ik hem cast naar een Student terwijl ik stud als volgt heb gedefineert
stud = new Student("naam"); dus java zou toch automatisch moeten weten dat dit een Student is....

kan je me beetje volgen?:p
dus mijn conclusie is dat polymorfisme totaal geen zin heeft als ik zou zeggen Student stud = new Student("naam"); dan kan ik alle methoden aanroepen zonder casten etc...
Vraagje: Waarom typ je
Code:
Persoon stud = new Student("naam");
en niet
Code:
Student stud = new Student("naam");
Op deze tweede manier kan je al de methodes van zowel Student als Persoon oproepen zonder enig gecast. ;)

Veel geluk nog!:thumb:
 
ik denk de reden voor polymorfisme gevonden

als je Persoon stud = new Student("naam");
doet, dan kan je at runtime (terwijl je programma opgestart is) makelijk veranderen naar een ander type dan kan je bv: later in je programma zetten stud = new Docent("naam") dan word je student een docent.

nu dit is niet zo een goed voorbeeld maar stel dat je een spelletje maakt met monsters dan zou je bv kunnen zeggen dat een monster kan evolueren in een ander monster na verloop van tijd... :)

Monster monster = new BeginMonster();
monster = new SuperMonster()...

dat is mijn idee kweet natuurlijk niet of dat helemaal correct is....
 
Ja, natuurlijk, je kan het zo gebruiken, dat kan een van de toepassingen ervan zijn. Maar het is zeker niet de enigste ;-)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan