# Methode von Basisklasse aufrufen



## 00x (15. Nov 2008)

```
class Foo{
		void doo() {
			System.out.println("foodoo");
		}
	}
	class Bar extends Foo {
		void doo() {
			System.out.println("bardoo");
		}		
	}
	
	class Clazz extends Bar {
		void doo() {
			System.out.println("clazzdoo");
			super.doo(); // wie foo.doo() aufrufen? 
			
		}				
	}
```
Wie kann man methoden von Klassen aufrufen, die nicht direkt super sind, aber trotzdem in der Vererbungshierarchie sind?


----------



## diggaa1984 (15. Nov 2008)

indirekt indem du in Bar auch nochmal super aufrufen würdest ^^


----------



## 00x (15. Nov 2008)

Was ja nicht viel bringt, wenn ich Bar.doo überschreiben will und dann noch Foo.doo aufrufen will.


----------



## ARadauer (15. Nov 2008)

allgemein bringt es nix wenn du Bar.doo überschreibst und Foo.doo aufrufen willst. das ist nicht sinn der sache.
warum überschreibst du sie dann? nenn die methode halt anders...

kann auch nicht sagen, ich will + nehmen es soll aber subtrahiert werden...


----------



## 00x (15. Nov 2008)

Es kommt allgemein öfters vor, dass man super Methoden aufruft, wenn man diese überschreibt z.B. super.paint bei Containern. Wenn ich genau diese überschreiben will, kann ich sie nicht anders nennen. Wenn ich jetzt ein Bar hab das sich sehr änhlich wie Clazz verhält, aber sich ein bisschen anders zeichnet, dann will ich nicht Bar.paint, sondern Container.paint aufrufen. Ich könnte jetzt irgendwelche umleitfunktionen einbauen oder abstrakte Klasse dazwischen bauen, aber das find ich relativ umständlich. In C++ würde ich einfach Container:aint aufrufen.


----------



## ps (15. Nov 2008)

Das geht? Wundert mich doch sehr.

Das Problem ist doch das du in "Bar" die Methode bereits überschrieben hast. Wenn du jetzt eine Klasse von Bar ableitest, kann die ursprüngliche Methode in Foo nicht mehr da sein. Das wäre ja absolut unlogisch 

Du sagst ja: 
Bar ist eine Foo.
Nur eine Kleinigkeit ist anders, nämlich doo().
Dann sagst du Clazz ist eine Bar.

Und jetzt willst du in Clazz, welche eine Bar ist auf eine der Methoden zugreifen welche eine Bar von einem Foo unterscheidet. Das macht keinen Sinn.

Deine Objektlogik stimmt nicht.. ich würde da nochmal ein bisschen Hirnschmalz reinstecken.


----------



## 00x (16. Nov 2008)

Natürlich geht das. Wenn ich eine Methode überschreibe ist die Methode der Basisklasse doch nicht weg, sonst könnte man ja garkeine super Methode aufrufen.

Wenn Bar ein spezieller Container ist und Clazz ein spezielles Bar, dann ist Clazz natürlich auch ein Container.


----------



## SlaterB (16. Nov 2008)

denkbar ist theoretisch alles,
es bleibt aber festzuhalten, dass es in Java nicht geht, und zwar nicht nur durch irgendwelche super-Aufrufe nicht sondern generell unmöglich ist, auch durch Reflection nicht oder was man sich sonst ausdenken könnte,

und dass es in Java extra so gedacht ist und bisher nirgendwo zu Problemen geführt hat, außer dass man gezwungen ist, sauber zu programmieren


man führt auch keine Mehrfachvererbung ein, nur weil irgendwo mal eine Konstellation von vorgegebenen Klassen existiert,
die einen anderen Weg außer komplizierten Neubau verhindert


----------



## Gast2 (16. Nov 2008)

Moin,



			
				00x hat gesagt.:
			
		

> Natürlich geht das



nein geht nicht ... Du versuchst von Bar über Super eine Methode von Foo aufzurufen ... aber Super ist in dem Fall Bar und NICHT Foo ... wenn Du von Bar Foo aufrufen willst, dann musst Du eine Referenz von Foo nach Bar durchreichen

das was Du willst funktioniert mit *keiner* OOP-Sprache

hand, mogel

PS: nein - Reflection hat nichts mit OOP zu tun


----------



## 00x (16. Nov 2008)

mogel hat gesagt.:
			
		

> 00x hat gesagt.:
> 
> 
> 
> ...


Nur weil die Java Syntax auf super beschränkt ist geht das in Java nicht.
In C++ ruf ich einfach von Clazz aus
Bar::doo()
oder
Foo::doo()
auf, das geht ohne Probleme und macht genau das was ich will. Oder ist C++ jetzt keine OOP Sprache mehr?


----------



## Gast2 (16. Nov 2008)

Moin,



			
				00x hat gesagt.:
			
		

> Nur weil die Java Syntax auf super beschränkt ist geht das in Java nicht.



ach Mist ... ich erkenne gerade das Du keinen Baum an Vererbung hast, sondern eine Sequenz ... das sollte natürlich in jeder OOP-Sprache funktionieren ... versuch mal Dein Glück mit

```
super.super.doo();
```

Nachtrag:
es gibt unter Java keinen direkten Zugriff wie unter C++, da Java keine Multivererbung unterstützt

hand, mogel


----------

