# Aufrufen einer Methode einer abgeleiteten Klasse von Oberkla



## sep (12. Apr 2006)

Hello everybody out there using Java ;-)

mein Prob:

ich habe eine Oberklasse HALGS, von der ich mehrere Klassen abgeleitet habe.
HALGS besitzt alle Methoden (Getter/setter) seiner "Kinder" (nur die abgespeckten ohne code)
HALGS ist nicht abstract.

eine Funktion (z.B. add() ), die als Parametertyp die Oberklasse benutzt, soll aber auf die Methoden der Kindklassen zugreifen können:

HALGS
    - Term
    - Number
    - Error
    - Variable
    - Function



```
public HALGS add(HALGS a, HALGS b) {    // die übergebenen (beim Aufruf..., also z.B. add(Number a, Variable b) ) Objekte sind nicht vom Typ HALGS sondern von einem abgeleiteten, also z.B. Term, Number, ...
    if (a.isEmpty() == true) {                    // es wird isEmpty() der Klasse HALGS aufgerufen, ich möchte aber die Funktion isEmpty der jeweiligen Unterklasse erreichen.
        
    }
}

public class HALGS {
	public boolean isEmpty() {
		return true;
	}
}

public class Number implements HALGS {
	public boolean isEmpty() {
                    if (entscheiden ob true oder false) {
                        return false;
                    }
                    else {
                        return true
                    }
	}
}
```


Vielen Dank schon mal im voraus, ich hope des is verständlich [/code]


----------



## Illuvatar (12. Apr 2006)

Nun schwierige Sache, ich denke, das schönste wäre es schon, wenn du die Klasse abstract hättest... ansonsten würde mir noch etwas mit Reflection einfallen, in der Art:

```
public HALGS add(HALGS a, HALGS b) {
    Class<HALGS> clazz = a.getClass();
    Method isEmptyMethod = clazz.getMethod("isEmpty");
    Boolean isEmpty = (Boolean)isEmptyMethod.invoke();
    if (isEmpty.booleanValue()) {
        
    } 
}
```


----------



## Murray (12. Apr 2006)

So ganz verstehe ich das Problem nicht:

1. Der Code dürfte so nicht übersetzbar sein: entweder ist HALGS ein Interface, dann kann z.B. Number dieses Interface implementieren ("class Number implements HALGS"). Oder HALGS ist eine Klasse, dann muss Number davon abgeleitet sein ("class Number extends HALGS"). Im Moments soll Number eine Klasse implementieren, was definitonsgemäß nicht geht,

2. M.E. stimmt dieser Kommentar einfach nicht:

```
public HALGS add(HALGS a, HALGS b) {    
    if (a.isEmpty() == true) {                  
          // es wird isEmpty() der Klasse HALGS aufgerufen, ich möchte aber die Funktion 
         // isEmpty der jeweiligen Unterklasse erreichen.
    }
}
```

Es spielt hier keine Rolle, dass a als HALGS deklariert ist; zur Laufzeit wird der terminale Type (also z.B. Number) herangezogen. Es wird also automatisch Number.isEmpty() aufgerufen, wenn a vom Typ Number ist.


----------



## Illuvatar (12. Apr 2006)

Hmja, Murray hat natürlich eigentlich recht, ich hab nicht lange darüber nachgedacht, weil ich dachte, dass du das schon probiert haben wirst... :?


----------



## Guest (14. Apr 2006)

jo, hab mich da verschrieben, das sollte natürlich "Number extends HALGS" heißen   

ich muss jetzt mit noch nem Oops kommen, des hat sich erledigt, war mein Fehler, sorry!


----------

