Methoden der Unterklasse in Oberklassen-Datentyp anwenden

Status
Nicht offen für weitere Antworten.

p-flash

Aktives Mitglied
Hi,

Code:
Oberklasse k = new Unterklasse();

Wenn ich jetzt zB k.methodeDerUnterKlasse(); anwenden möchte klappt es nicht, da der Typ von der Oberklasse ist.
Wie kann man für diesen einen Methoden-aufruf das Objekt casten?

Schonmal danke.

p-flash
 

schmalhans

Bekanntes Mitglied
Code:
 Unterklasse k = new Unterklasse();

So muss das richtig heißen.

dann einfach:

Code:
k.methodeDerUnterKlasse();


Oder Cast:

Code:
Oberklasse o = (Oberklasse)k;
 

p-flash

Aktives Mitglied
Man kann doch jede Unterklasse dort benutzen wo eine Oberklasse einsetzbar ist oder? Dann sind nur die Methoden abrufbar, die der Oberklasse gehören.

p-flash
 

Jörg

Bekanntes Mitglied
Aber du kannst nicht mit der Oberklasse auf Methoden der Unterklasse zugreifen, wenn diese fremd fuer die Oberklasse sind, spricht dort nicht vorgesehen sind ...

Code:
		O o = new U();
		...
		U u = (U) o;
		u.unterklassenmethode();
ist etwas sinnfrei, funktioniert aber ..., nur woher willst du
wissen, dass zu bestimmten Zeitpunkten in o auch wirklich ein
u steckt...??
 

p-flash

Aktives Mitglied
Ich dachte da gibt es vllt sowas wie instanceof. Ich kenne das von Flash.

Code:
if(o instanceof U)
 // rufe die methode der Unterklasse auf.

Oder gibt es das bei java nicht?
 

schmalhans

Bekanntes Mitglied
Nicht das ich wüsste.
Das Casten geht mit einem: (Oberklasse) Aber es ist wirklich sinnfrei es zur Oberklasse zu casten, nur um auf die O-Funktionen zuzugreifen. Da wäre die Vererbung umsonst.
 

Sky

Top Contributor
Also,
1.) Man kann von U nach O casten
2.) Man kann mit instanceof arbeiten
3.) Es macht wirklich keinen Sinn: Entweder ich arbeite mit O (und benutze nur dessen Methoden) oder ich arbeite direkt mit U.
 
B

bygones

Gast
Sky hat gesagt.:
3.) Es macht wirklich keinen Sinn: Entweder ich arbeite mit O (und benutze nur dessen Methoden) oder ich arbeite direkt mit
U.
das ist der entscheidende Punkt. Warum die Oberklasse nehmen, wenn du Methoden der Unterklasse verwendest ? das ist unsinnig.
 

p-flash

Aktives Mitglied
Hehe...also ich hatte mir ungefähr soetwas gedacht:

Die Klasse OberK hat zum Beispiel mehrere Unterklassen.

Und in einer anderen Klasse gibt es die Methode:
Code:
public boolean machWas(OberK o)
{
    o.getDies();
    o.setDas();
    if(o instanceof U)
       return o.eigeneMethodeVonU();
    return o.gemeinsameMethode();
}

Hier wird für jede Unterklasse das gleiche gemacht. Handelt es sich um eine Instanz von U, dann wird ein anderer Rückgabewert zurückgegeben. So muss ich nicht eine extra Methode schreiben, die U als Parameter hat.

p-flash
 

Sky

Top Contributor
Dann schreib doch ne Methode 'machWas' in O und überschreib sie -bei Bedarf- in deinen Unterklassen.

Ein Beispiel:
Code:
class TestKlasse {
  public static void main( String[] args )  {
   SuperKlasse s1 = new SuperKlasse();
   s1.machWas();

   SuperKlasse s2 = new UnterKlasse1();
   s2.machWas();

   SuperKlasse s3 = new UnterKlasse2();
   s3.machWas();
  }
}


class SuperKlasse {
  public void machWas() {
    System.out.println( "machWas von SuperKlasse" );
  }
}

class UnterKlasse1 extends SuperKlasse {
  public void machWas() {
    System.out.println( "machWas von UnterKlasse1" );
  }
}

class UnterKlasse2 extends SuperKlasse {
}
und die Ausgabe sieht so aus:
Code:
machWas von SuperKlasse
machWas von UnterKlasse1
machWas von SuperKlasse
 

p-flash

Aktives Mitglied
Normalerweise würde das klappen, aber nehmen wir mal an wir haben eine Klasse Raumschiff. Von der Klasse erben SchwachesSchiff und StarkesSchiff.

Die Klasse Raumschiff hat die Methode bekommeSchaden()

StarkesSchiff hat noch die Methode bekommeSchutzschildSchaden()
(die namen sind bischen blöd gewählt).

Dann steht bei der Methode

Code:
public void machSchaden(Raumschiff r)
{
    r.setGetroffenVon(this);
    if(r instanceof StarkesSchiff)
         r.bekommeSchutzschildSchade();
    else
       r.bekommeSchade();
}

Ich weiß das man das irgendwie umschreiben kann, aber das wäre sehr praktisch so.

p-flash
 

mic_checker

Top Contributor
dann schreib die methode in die oberklasse und in StarkesSchiff überschreibst du sie so das sie nen Wert zurückliefert (oder was die methode auch immer machen soll).
 

Sky

Top Contributor
Wo ist dein Problem?? Ich habe mal nach den Code nach deinen Namen geändert (Logik bleibt aber die gleiche):
Code:
class TestKlasse {
  public static void main( String[] args )  {
   Raumschiff s1 = new Raumschiff();
   s1.bekommeSchaden();

   Raumschiff s2 = new SchwachesSchiff();
   s2.bekommeSchaden();

   Raumschiff s3 = new StarkesSchiff();
   s3.bekommeSchaden();
  }
}


class Raumschiff  {
  public void bekommeSchaden() {
    System.out.println("Hier macht die Methode nix...");
  }
}

class SchwachesSchiff  extends Raumschiff {
  public void bekommeSchaden() {
    System.out.println( "habe einen grossen Schaden" );
  }
}

class StarkesSchiff extends Raumschiff {
  public void bekommeSchaden() {
    System.out.println( "habe einen kleinen Schaden" );
  }

}
 

Sky

Top Contributor
p-flash hat gesagt.:
Hmm...ok, ich werde schon irgendwie machen. ist nur etwas ungewohnt.

Danke für die Hilfe.

p-flash
Vorteil an der Variante ist einfach: Wenn Du noch mehr "Schiffe" (sprich Unterklassen) bekommst, so musste nicht mit 1000 if-Abfragen arbeiten, sondern die Logik liegt immer da, wo sie hingehört: In dem "Schiff" (der Klasse natürlich) welches den Schaden bekommt...

Auch, wenn's für'n Anfänger ungewöhnlich aussieht (auch wenn ich nicht verstanden habe, was daran ungewohnt ist)
 

schmalhans

Bekanntes Mitglied
Sky hat gesagt.:
Vorteil an der Variante ist einfach: Wenn Du noch mehr "Schiffe" (sprich Unterklassen) bekommst, so musste nicht mit 1000 if-Abfragen arbeiten, sondern die Logik liegt immer da, wo sie hingehört: In dem "Schiff" (der Klasse natürlich) welches den Schaden bekommt...

Ist nicht genau das der Vorteil von Vererbung? Wenn es nicht so wäre, wäre ja Vererbung fürn "Po". ;)
 

p-flash

Aktives Mitglied
Ungewohnt es weil ich es von Flash anders kenne und davon halt auch öfters gebraucht gemacht habe. Den Sinn der Vererbung habe ich schon verstanden.

Aber (vielleicht ist mein Kopf zu sehr Flash orientiert) es gibt zB Situation wo mein Schiff einfach nur schaden bekommt. Ist es zB in einem anderen Level sollen noch zu zusätzlich 10 andere Methoden aufgerufen werden. Das soll nur bestimmte unterklassen gelten. Und das ist bei allen zb 20 Leveln anders. Dann müsste ich ja theoretisch in der unterklassen methode 20 if-abfragen machen:

Code:
if(level == 1)...
if(level == 2)...
etc...

Dann finde ich sieht man den Vorteil (den zB Flash bietet). Aber wie gesagt, ich programmiere ziemlich intensiv mit Flash und deshalb ist das eine andere Kultur, an der ich mich gewöhnen muss.;) Oder sieht ihr den Vorteil jetzt auch?? :lol:

p-flash
 

Sky

Top Contributor
Du könntest alternativ auch den Schaden von der Unterklasse in Abhängigkeit vom Level zurück geben lassen:

Code:
public int getSchaden( int level ) {
  //...
}

und dann in der Obklassen sagen:
Code:
computeSchaden( int schaden ) {
  //...
}
 

PyroPi

Aktives Mitglied
Ich glaub das Ausgangsproblem sollte mit Castings aber funktionieren:

Code:
public boolean machWas(OberK o)
{
    o.getDies();
    o.setDas();

    if(o instanceof U)
       return ((U)o).eigeneMethodeVonU();
    if(o instanceof X)
       return ((X)o).eigeneMethodeVonX();

    return o.gemeinsameMethode();
}
 

p-flash

Aktives Mitglied
Aber das habe ich doch die ganze Zeit gefragt:

Wenn ich jetzt zB k.methodeDerUnterKlasse(); anwenden möchte klappt es nicht, da der Typ von der Oberklasse ist.
Wie kann man für diesen einen Methoden-aufruf das Objekt casten?

Dann geht es ja doch. Das hatte mich schon sehr gewundert. Dann ist das Problem ja gelöst.

Danke.

p-flash
 

Jörg

Bekanntes Mitglied
Aber das habe ich doch die ganze Zeit gefragt:
und ich hab dir doch geantwortet!??
Code:
U u = (U) o; 
u.unterklassenmethode();

einzig instanceof hat noch gefehlt ...
(hier wuerde ne ClassCastException geworfen werden)

wobei mir das immernoch nicht gefaellt.
Normalerweise wuerde ich das so aehnlich machen (wie Sky bereits vorgeschlagen):
Code:
 class Oberklasse { 
   void bekommeSchaden(){}
 }

 class Unterklasse extend Oberklasse {
   void bekommeSchaden() // ueberschreibt Oberklasse
   {
        spezifischerSchaden();
   }
   void spezifischerSchaden(){..}
 }

sonst endest du in instanceof-Bergen, was nicht der Sinn sein kann,
afaik sind die eh recht teuer ...
 

p-flash

Aktives Mitglied
Die Frage war ja nach einem einmaligen Casting, also nur für diesen einen Methodenaufruf, wobei euer Verfahren wahrscheinlich wohl besser ist. Naja, ich muss noch einiges lernen.

Danke.

p-flash
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
Y Java Methoden Unterklasse Java Basics - Anfänger-Themen 7
B Vererbung Probleme bei Zugriff auf protected-Methoden in einer Unterklasse Java Basics - Anfänger-Themen 27
D Vererbung Auf Methoden der Unterklasse zugreifen Java Basics - Anfänger-Themen 2
DrahtEck Methoden Methoden und Werte Java Basics - Anfänger-Themen 10
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
J Argumente in Methoden übergeben Java Basics - Anfänger-Themen 1
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
Renjiroo Java Bmi Rechner mit Methoden Java Basics - Anfänger-Themen 4
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
Alen123 Erstes Arbeiten mit Methoden. Java Basics - Anfänger-Themen 5
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
M Erklärung von Ausnahmebehandlung in Methoden Java Basics - Anfänger-Themen 13
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
L Rekursive Methoden Java Basics - Anfänger-Themen 14
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
W Methoden aufrufen - auch klassenübergreifend? Java Basics - Anfänger-Themen 9
Kotelettklopfer Methoden nicht aufrufbar Java Basics - Anfänger-Themen 34
R Schulaufgabe, Bruache Hilfe mit non-static Methoden Java Basics - Anfänger-Themen 2
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
S Methoden - Warum int wenn auch void? Java Basics - Anfänger-Themen 3
H Kann man Methoden öfter aufrufen? Java Basics - Anfänger-Themen 2
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
Zeppi OOP Methoden mit einander Verknüpfen Java Basics - Anfänger-Themen 6
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
Junger_Basileus Celsius -> Fahrenheit / Strukturierung in statischen Methoden Java Basics - Anfänger-Themen 7
J Verschachtelte Methoden Java Basics - Anfänger-Themen 9
H Methoden in anderen Methoden aufrufen Java Basics - Anfänger-Themen 6
Kawastori Hilfe bei Methoden Übung Java Basics - Anfänger-Themen 6
veryck Methoden Rekursive Methoden mit Rückgabeparameter Java Basics - Anfänger-Themen 9
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
P Methoden aufrufen - Fehler Java Basics - Anfänger-Themen 20
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Generics Methoden Java Basics - Anfänger-Themen 7
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
S throws bei Methoden Java Basics - Anfänger-Themen 4
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
I Greedy Methode Methoden nutzen Java Basics - Anfänger-Themen 3
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
S Übergabe von Arrays an Methoden Java Basics - Anfänger-Themen 20
L Methoden Wie Löse ich ext Methoden Aufruf Fehler? Java Basics - Anfänger-Themen 3
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
T Methoden Verständnis Java Basics - Anfänger-Themen 14
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
Kirby.exe Methoden Aufrufe Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
H Aufruf von Methoden durch Methoden Java Basics - Anfänger-Themen 3
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
H Wie kann ich durch Methoden definiren? Java Basics - Anfänger-Themen 8
D Methoden Scannervariablen in static Methoden Java Basics - Anfänger-Themen 5
P Verzweigungen und Methoden Java Basics - Anfänger-Themen 10
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
B Polymorphie Warum funktionieren polymorphe Referenzvariablen bei überschriebenen Methoden und bei nicht überschriebenen nicht? Java Basics - Anfänger-Themen 3
B Methoden Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Methoden richtig anwenden Java Basics - Anfänger-Themen 3
C Zusammenfassen von Methoden in einer Hilfsmethode Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben