[java] aanroepen methode superclass

Pagina: 1
Acties:
  • 216 views sinds 30-01-2008
  • Reageer

  • The Flying Dutchman
  • Registratie: Mei 2000
  • Laatst online: 24-08 14:11
Ik vroeg me het volgende af (in het algemeen):
Stel je maakt een class en definieerd daarin een methode toString(). Nu maak je een instance van die class, vervolgens maak je een nieuw object aan. Je geeft dat object de waarde van de aangemaakte instance.

Nu roep je op die instance de methode toString() aan, dan zal de zelf gedefinieerde toString methode worden aangeroepen omdat java 'ziet' dat het object een instance is van je eigen gemaakte class. Maar stel nu dat je dat wilt overriden en de toString() methode van de class object wilt gebruiken, kan dat in java? En zoja, hoe?

Wat code om mijn voorbeeld te verduidelijken:
(stel je hebt een class Person en die bevat een methode toString())

code:
1
2
3
4
Person p = new Person();
Object o = p;

o.toString();


In bovenstaande code zal dus de toString methode uit de class Person worden aangeroepen, maar dat wil ik nu even niet, ik wil de toString methode van object gebruiken, hoe doe ik dat? Is het uberhaupt mogelijk?

The Flying Dutchman


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk niet dat dat wenselijk is omdat je niet voor niets het gedrag hebt overriden. Dit kan er zelfs voor zorgen dat jouw class gewoon niet meer doet wat het moet doen en dus 'broken' is.

Ik weet verder niet of het mogelijk is, alleen dat het onwenselijk is.

Verwijderd

code:
1
2
3
4
Person p = new Person();
Object o = p;
Person q = (Person) o;
String s = q.toString();

Of bedoelde je dat niet?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Lees nou eens even goed

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Alarmnummer schreef op 12 February 2003 @ 13:11:
Ik weet verder niet of het mogelijk is, alleen dat het onwenselijk is.


Nou ja het kan soms wel handig zijn, maar dan getuigt dat meestal wel van slecht design idd.

In C++ kan het wel, maar daar moet het soms ook, aangezien het multiple inheritance ondersteund. Dan kun je dus overerven van 2 klassen die dezelfde methodenaam hebben, en dan zul je dus bij de aanroep moeten kiezen omdat het anders ambigue is. Het werkt zo:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Base
{
    virtual void methode ();
}

struct Derived : public Base
{
    void methode ();
}


Derived d;
d.Base::methode ();  // roept Base::methode () aan met d als this



Goed, in java heb je dan geen multiple inheritance, maar je kunt wel een methode van de superclass aanroepen in de klasse zelf door het sleutelwoord super te gebruiken. Maar als dat kan, waarom dan niet buiten de klasse? instance.Object.toString () bijvoorbeeld (dit werkt niet, had ik al geprobeerd ;)). Ik ben nu wel nieuwschierig eigenlijk :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
.oisyn schreef op 12 February 2003 @ 14:08:
Goed, in java heb je dan geen multiple inheritance, maar je kunt wel een methode van de superclass aanroepen in de klasse zelf door het sleutelwoord super te gebruiken. Maar als dat kan, waarom dan niet buiten de klasse? instance.Object.toString () bijvoorbeeld (dit werkt niet, had ik al geprobeerd ;)). Ik ben nu wel nieuwschierig eigenlijk :)
Ik denk dat het technisch wel mogelijk is. Maar het is een constructie die elke weldenkende programmeur eigenlijk het liefst zou vermijden en ook totaal niet noodzakelijk is.

Ik vind dat de maker van de 'derived' class de verantwoordelijkheid heeft om een ToString() te maken die logisch de ToString() van de base class uitbreidt of verandert.
Wanneer een client 'derived.super::ToString()' oid zou kunnen aanroepen betekent dat dat je tegen een implementatie programmeert en niet meer tegen een interface wat nooit de bedoeling kan zijn.

  • The Flying Dutchman
  • Registratie: Mei 2000
  • Laatst online: 24-08 14:11
.oisyn schreef op 12 februari 2003 @ 14:08:

...

Goed, in java heb je dan geen multiple inheritance, maar je kunt wel een methode van de superclass aanroepen in de klasse zelf door het sleutelwoord super te gebruiken. Maar als dat kan, waarom dan niet buiten de klasse? instance.Object.toString () bijvoorbeeld (dit werkt niet, had ik al geprobeerd ;)). Ik ben nu wel nieuwschierig eigenlijk :)
Ja, ik heb zoiets momenteel ook niet nodig ofzo, maar het is bij mij ook meer uit nieuwsgierigheid. Ik heb mijn docent programmeren al gevraagd, maar hij wist het ook niet of het mogelijk was ja of nee...

Of het getuigd van slecht design weet ik niet, ik zou zo geen voorbeeld weten, maar ik kan me voorstellen dat het wel eens handig kan zijn om zoiets te gebruiken.

The Flying Dutchman

Pagina: 1