Methode van onbekend object aanroepen

Status
Niet open voor verdere reacties.

FvanEldijk

Nieuwe gebruiker
Lid geworden
11 apr 2009
Berichten
4
Hallo,

Ik heb in een Class ZomaarEenKlasse een property Parent van het type Object waarvan ik in run time niet weet wat voor Class dit object is. Maar alle Classen die een 'Parent' kunnen zijn hebben een methode void doSomething(int What).

Als ik in de Class ZomaarEenKlasse probeer om de methode doSomething aan te roepen dan beweert de compiler dat ie de methode niet kent.


Code:
class Moeder
{
   ZomaarEenKlasse Kind;

   public void doSomething(int What)
   {
      ...
   }

   public void MaakKind()
   {
      Kind=new ZomaarEenKlasse();
      Kind.Parent=this;
   }
}

class Vader
{
   ZomaarEenKlasse Kind;

   public void doSomething(int What)
   {
      ...
   }

   public void MaakKind()
   {
      Kind=new ZomaarEenKlasse();
      Kind.Parent=this;
   }
}

class Kind
{
   Object Parent;
   
    public void ParentAanHetWerk()
    {
        Parent.doSomething();
    }
}


Weet iemand waarom dit niet werkt?
 
Kort gezegd: dit werkt niet omdat de klasse Object geen methode doSomething() heeft. OK, Moeder en Vader hebben dat wel en zijn (impliciet) afgeleid van Object, maar ze zijn in Kind niet gekend als Moeder of Vader, ze zijn gekend als Object.

Je moet Java laten weten dat je Parent-variabele een methode doSomething() heeft, wat hier enkel kan door een niveau tussen Object en Vader/Moeder te plaatsen en dit niveau op te geven als z'n type. Je kan een (aldanniet abstracte) klasse Parent maken of een interface, afhankelijk van wat je nodig hebt. Daarna moet je nog Moeder en Vader laten afleiden van je klasse of de interface laten implementeren. Ten slotte moet je in Kind je parent declareren als die klasse of interface - nu heb je toegang tot de methode.

vb:
Code:
public interface Parent {
 public void doSomething(int What);
}

class Moeder implements Parent {
...
}

class Vader implements Parent {
...
}

class Kind
{
   Parent parent; // onthou conventie in Java: variabelen starten met een kleine letter

    public void ParentAanHetWerk()
    {
        parent.doSomething(...);
    }
}

Dit zijn de aanpassingen die je moet maken om het te doen werken.

Voor de volledigheid, je had het kunnen forceren door te casten:
Code:
public void ParentAanHetWerk()
{
        if(Parent instanceof Moeder)
                ((Moeder)Parent).doSomething(...);
        else if(Parent instanceof Vader)
                ((Vader)Parent).doSomething(...);
}

Onthou dat je, vertrekkende van een declaratie, altijd kan veralgemenen (als interface of klasse hoger in de hiërarchie beschouwen) en nooit zomaar specialiseren. Hier gebeurt dit met een zgn. cast: Parent is een Object en je geeft expliciet op welk type Object het is, Moeder of Vader. In dit voorbeeldje raad ik je de bovenste oplossing aan ;).
 
Laatst bewerkt:
Dank....

Ok,

Dank je voor je heldere antwoord. Ik heb de laatste jaren vooral met PHP gewerkt en moet nog wat wennen aan de strengere regels van Java.

Maar dankzij het voorbeeld heb ik een aardig idee hoe ik mijn code even opnieuw moet ontwerpen - en dat valt zo te zien reuze mee.

Dank voor je antwoord.
Fedor
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan