Überschreiben von Methoden erzwingen

Status
Nicht offen für weitere Antworten.

TSH

Bekanntes Mitglied
Hallo,

hat jemand eine Idee, wie ich das folgende realisiere? Essen machen soll im Prinzip für alle gleich ablaufen, die Art zu kochen soll aber jeder konkrete Koch überschreiben (müssen). Geht das?

Code:
public interface Koch {

  public machEssen();
  
}

public abstract class Abstract Koch implements Koch {

  public machEssen() {
    this.kaufeEin();
    this.koche();
    this.raeumAuf();
  }

  protected kaufeEin() {
    // Soll für alle gleich sein
  }

  protected koche() {
    // Hier möchte ich ein Überschreiben durch die konkreten Klassen erzwingen
  }

  protected raeumAuf() {
    // Soll für alle gleich sein
  }

}

public abstract class ChinesischerKoch extends AbstractKoch {

  // Essen machen an sich, einkaufen und aufräumen soll ererbt werden.
  // Nur die koche()-Methode, die beim Essen machen angewandt wird,
  // möchte ich überschreiben (und der Compiler soll schimpfen, wenn
  // ich's nicht tue.

  protected koche() {
    // Koche nach chinesischer Art
  }

}

public abstract class ItalienischerKoch extends AbstractKoch {

  // Wie oben.

  protected koche() {
    // Koche nach talienischer Art
  }

}
 
S

Spacerat

Gast
Recht einfach... In der abstrakten Klasse Koch die implementierung von "machEssen()" weglassen oder "koche()" als abstrakt markieren.

mfg Spacerat

@Edit: Bei genauerem Hinsehen stelle ich fest, das das Interface recht überflüssig ist. Die einzige Methode dieses Interfaces ist ja bereits vom abstrakten Koch implementiert. Das bedeutet:
-Interface weglassen,
-"machEssen()" public final
-"koche()" protected abstract
-alle anderen von "Koch" private final
 

TSH

Bekanntes Mitglied
Danke, aber mach essen enthält ja vieles, was für alle Köche gleich ist. Die einzelnen Methoden zum Einkaufen, Aufräumen und dem Essen-Kochen-Gesamtprozess würde ich schon gerne da drin lassen.

Sonst müsste ich ja alles x-mal implementieren.
 
S

SlaterB

Gast
Methoden, die nicht überschrieben werden dürfen, kann man als final deklarieren
 

Tobias

Top Contributor
Code:
public interface Koch {

  public void machEssen(); // Ohne Rückgabewert (z.B. void) meckert der Compiler sowieso ;)
 
}

public abstract class AbstractKoch implements Koch {

  public void machEssen() {
    this.kaufeEin();
    this.koche();
    this.raeumAuf();
  }

  protected void kaufeEin() {
    // Soll für alle gleich sein
  }

  protected abstract void koche(); // abstract ist das Zauberwort!!

  protected void raeumAuf() {
    // Soll für alle gleich sein
  }

}

public class ChinesischerKoch extends AbstractKoch {

  // Essen machen an sich, einkaufen und aufräumen soll ererbt werden.
  // Nur die koche()-Methode, die beim Essen machen angewandt wird,
  // möchte ich überschreiben (und der Compiler soll schimpfen, wenn
  // ich's nicht tue.

  protected void koche() {
    // Koche nach chinesischer Art
  }

}

public class ItalienischerKoch extends AbstractKoch {

  // Wie oben.

  protected void koche() {
    // Koche nach talienischer Art
  }

}
 

TSH

Bekanntes Mitglied
(gelöscht. Muss erstmal die o.g. Antwort ausprobieren. Danke Euch allen schon mal!)
 

didjitalist

Bekanntes Mitglied
Spacerat hat gesagt.:
-alle anderen von "Koch" private final
final kann man sich bei private methoden sparen. der einzige zweck wär nen hint an den compiler, die methode zu inlinen. aber das würd er, wenns angebracht ist, eh machen.
 

TSH

Bekanntes Mitglied
Danke! Das Interface ist aus anderen Gründen notwendig. Abstract war genau der Tipp, den ich gebraucht habe. Jetzt klappt es.
 
S

Spacerat

Gast
didjitalist hat gesagt.:
final kann man sich bei private methoden sparen. der einzige zweck wär nen hint an den compiler, die methode zu inlinen. aber das würd er, wenns angebracht ist, eh machen.
Das ist definitiv falsch! Auch private Methoden können überschrieben werden (vgl. "Serializable" "readObject" und "writeObject"). Das einzige, was bei überlagerten Methoden dieser Art ausfällt, ist der Aufruf der überlagerten Methode der Superklasse. Ausserdem bringt "final" einen nicht zu verachtenden Performance-Vorteil. Ist aber alles nicht Teil des Themas... BTT

mfg Spacerat
 
S

SlaterB

Gast
werden diese Methoden bei Serializable nicht pro Klasse einzeln aufgerufen?
und das sowieso ohne Interface per Reflection, das zählt doch nicht als normales Beispiel
 
S

Spacerat

Gast
SlaterB hat gesagt.:
werden diese Methoden bei Serializable nicht pro Klasse einzeln aufgerufen?
und das sowieso ohne Interface per Reflection, das zählt doch nicht als normales Beispiel
Immer alles petzen :). Aber ob nun Reflection oder nicht... Fakt ist doch, das die besagten Methoden "private" sind und möglicherweise irgendwann sogar überlagert werden müssen. So wie didjitalist das schreibt, klingt das aber so, das man sich bei "private"-Methoden das "final" sparen kann, weil sie eh' nicht überlagert werden können. Betrachtet am Beispiel "Serializable", bleibt diese Aussage immer noch definitiv falsch! Und hier macht "private final" eben deswegen Sinn, damit kein "Koch" jemals weder das "Einkaufen" noch das "Aufräumen" (durch überlagern der entsprechenden Methoden) vergisst.

mfg Spacerat
 

didjitalist

Bekanntes Mitglied
der performance vorteil von final rührt schlicht daher, dass für solche methoden polymorphie keine rolle spielt (virtual diskussion für c++ junkies), wenn ihr laufzeittyp konkret genug ist und der compiler sich mit höhrer wahrscheinlichkeit entscheiden wird, solche methoden daher sogar zu inlinen.

private methoden erfüllen diese kriterien ebenfalls. für sie spielt polymorphie keine rolle und wenn sie gerufen werden, ist immer ihr konkretes objekt am werk.

eine ausnahme bildet der zugriff über reflection, aber damit kann man so eine methode nicht plötzlich überlagern, nur rufen. readObject und writeObject sind dafür tatsächlich konkrete beispiele.
 
S

Spacerat

Gast
Was heisst denn "damit kann man so eine Methode nicht plötzlich überlagern"? Wie gesagt, hört sich nach wie vor so an, als könnte man es nicht. Dann erweitere mal ein "Serializable", welches die Schreib- und Lese-Methoden bereits implementiert hat. Wenn du nun eine eigene Implementation dieser Methoden brauchst hättest du in diesem Fall ein Problem, wenn du recht hättest (Irrtum).
Code:
public final class FaulerKoch
extends AbstractKoch
{
    protected void koche()
    {
        // wenn ich Zeit habe
    }

    private void kaufeEin()
    {
        // kein Geld
    }

    private void raeumeAuf()
    {
        // wozu?
    }
}
dieser Koch wird weder aufräumen noch einkaufen. Das ist möglich, weil der "AbstractKoch" ein überschreiben dieser Tätigkeit zulässt ("final" kann eben doch nicht weggelassen werden). Bevor du drauf antwortest... probier's aus... (Ich hab's getan... deswegen ist das kein Triezen, sondern mehr ein Tip, bevor du dich blamierst...)

mfg Spacerat
 
S

SlaterB

Gast
was genau ist eigentlich deine Aussage?
in
Code:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bout);
        out.writeObject(new B());
    }
}


class A
    implements Serializable
{
    private final void writeObject(ObjectOutputStream out)
    {
        System.out.println("A writeObject");
    }
}


class B
    extends A
{
    private final void writeObject(ObjectOutputStream out)
    {
        System.out.println("B writeObject");
    }
}
erscheint als Ausgabe
Code:
A writeObject
B writeObject

zwei Dinge sind auf jeden Fall festzuhalten:
1. private-Methoden haben nichts mit Vererbung zu tun
und
2. private-Methoden haben nichts mit final zu tun,
ergibt sich quasi zwangsläufig, da final bei Methoden nur mit Vererbung zu tun hat

was ist denn dein Beispiel?

dass die protected-Methode koche() nicht final ist und deshalb überschrieben werden kann
und dass ein FaulerKoch sämtliche private Methoden für sich neu deklarieren kann sind doch ganz andere Aussagen
(bzw. wieder zu final: mit final kann man nicht verhindern, was sich der faule Koch privat alles neu definiert)

da von 'blamieren' zu sprechen..
 
G

Gast

Gast
Sapcerat du laberst Unsinn, private Methoden kann man natürlich nicht überschreiben (überlagern ist übrigens was völlig anderes, weiß auch nich wieso du manchmal davon redest).
Dein Beispiel mit Serializable ist völliger Blödsinn, da
a) Interfaces weder private noch final Methoden haben können, wär ja auch sinnlos.
b) Serializable keine einzige Methode spezifiert, die ganze read/write Geschichte ist allein in der Dokumentation spezifiziert und der ganze Serialisierungskram wird mit Reflection gelöst. Hat nichts mit final oder private zu tun. Ob ich meine read/write Methoden private oder final mache ist übrigens egal.
 
S

SlaterB

Gast
das ist Überladung, und das sollte doch der Anonyme erkennen ;)
 
S

Spacerat

Gast
Ist es nicht so, das, wenn die privaten Methoden des AbstractKoch "final" wären, der Faule Koch gar nicht funktioniert, weil er eben "finale" Methoden überschreibt? Welche "kaufeEin" Methode wird denn von der JVM aufgerufen? die vom AbstractKoch oder die vom FaulenKoch? Doch wohl die vom faulen? Oder blamier ich mich jetzt hier?

mfg Spacerat
 
S

SlaterB

Gast
wenn AbstractKoch in seinen Methoden eine private Methode aufruft, dann ist es garantiert die eigene,
egal ob Subklassen gleichlautende Methoden definieren, ob privat oder nicht privat
 
S

Spacerat

Gast
Sch... so rum hab' ich das natürlich nicht gesehen. Hab' eigentlich immer angenommen, das die JVM mit der Instanzklasse zuerst arbeitet und deswegen die private Methode der Vaterklasse gar nicht mehr sieht. Naja... wieder was gelernt... Schwamm drüber...

mfg Spacerat
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Überschreiben von Methoden Allgemeine Java-Themen 6
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
C Überschreiben mit kontravariante Parameter Allgemeine Java-Themen 13
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
M Überschreiben der clone()-Methode Allgemeine Java-Themen 10
T Direktes Überschreiben Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
M Überschreiben? Allgemeine Java-Themen 3
A FileChooser Datei-Überschreiben Abfrage Allgemeine Java-Themen 2
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
N abstracte klassen methoden Allgemeine Java-Themen 32
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
B Methoden Java Getter und Setter Methoden Allgemeine Java-Themen 9
Y Java Methoden unterschiedliche Zahlenreihen Allgemeine Java-Themen 2
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
D Methoden Methoden anpassen und fehlende Funktionen hinzufügen Allgemeine Java-Themen 475
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
L mehrere Methoden Allgemeine Java-Themen 19
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Q-bert Methoden Methoden in Java Allgemeine Java-Themen 13
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
E OOP Objekte und Methoden Allgemeine Java-Themen 1
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
T Java Array in Methoden Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
A Methoden verändern Allgemeine Java-Themen 12
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
Paul15 String Methoden Allgemeine Java-Themen 7
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Testen von Methoden Allgemeine Java-Themen 3
S "Vererben" statischer Felder/Methoden Allgemeine Java-Themen 4
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Methoden ohne Methodenkopf ?! Allgemeine Java-Themen 5
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
S Methoden Methoden überschreiben Allgemeine Java-Themen 3
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
S Methoden Frage Allgemeine Java-Themen 2
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
M Methoden in Rescources speichern Allgemeine Java-Themen 4
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
A Vererbung finale Methoden überschreiben Allgemeine Java-Themen 24
A Methoden parallelisieren? Allgemeine Java-Themen 2
L Methoden methoden an generischen klassentyp anpassen Allgemeine Java-Themen 5
C Methoden Übernahme von standart nativen Methoden? Allgemeine Java-Themen 9
B Zusammenfassen verschiedener ähnlicher Methoden Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
MiMa Rekursive Methoden Allgemeine Java-Themen 3
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
F ListIterator (next & previous methoden) Allgemeine Java-Themen 5
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
T Methoden per String-Namen aufrufen Allgemeine Java-Themen 2
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
K Auf Methoden der Runnable Klasse zugreifen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben