Vererbung stoppen, ohne final zu verwenden

8

Gibt es eine andere Methode, die Vererbung einer Klasse zu stoppen, abgesehen davon, dass sie als final deklariert wird oder indem ihr Konstruktor als privat deklariert wird?

    
bdukes 16.01.2009, 17:00
quelle

8 Antworten

20

Ein Kommentar

%Vor%     
vava 16.01.2009 17:02
quelle
19

Zwei weitere Optionen:

  • macht jede Methode endgültig, damit die Leute sie nicht überschreiben können. Sie vermeiden auf diese Weise den versehentlichen Aufruf von Methoden aus der Unterklasse. Dies hört jedoch nicht auf, Unterklassen zu bilden.

  • Überprüfe den Konstruktor für die Klasse:

    %Vor%

    Dann kann niemand die Unterklasse Ihrer Klasse instanziieren.

(Nicht, dass ich vorschlage, diese Techniken zu verwenden, es kam mir gerade in den Sinn. Ich würde den letzten Klassen- und / oder privaten Konstruktor verwenden)

    
Peter Štibraný 16.01.2009 17:12
quelle
8

Final wurde erstellt, um dieses Problem zu lösen.

    
NotMe 16.01.2009 17:04
quelle
5
  • Verwenden Sie final
  • Verwenden Sie private Konstruktoren
  • Verwenden Sie einen Kommentar:

    %Vor%
  • Verwenden Sie einen Javadoc-Kommentar

  • Machen Sie jede Methode endgültig, damit die Leute sie nicht überschreiben können
  • Verwenden Sie eine Laufzeitprüfung im Klassenkonstruktor:

    %Vor%
Landon Kuhn 16.01.2009 17:22
quelle
3

Die Verwendung von final ist der kanonische Weg.

%Vor%

Wenn Sie verhindern möchten, dass einzelne Methoden überschrieben werden, können Sie sie stattdessen als final deklarieren. (Ich rate nur hier, warum Sie vermeiden sollten, die ganze Klasse zum Abschluss zu bringen.)

    
Bill the Lizard 16.01.2009 17:13
quelle
3

Machen Sie Ihre Konstruktoren privat und stellen Sie Factory-Funktionen bereit, um Instanzen zu erstellen.

Dies kann besonders hilfreich sein, wenn Sie eine geeignete Implementierung aus mehreren auswählen möchten, aber keine beliebige Unterklasse wie in

zulassen möchten %Vor%     
Mike Samuel 17.01.2009 03:40
quelle
1

Ich muss sagen, dass es normalerweise eine schlechte Form ist. Obwohl es fast immer Fälle gibt, in denen etwas gültig ist, würde ich sagen müssen, dass die Vererbung in einer OO-Welt normalerweise keine gute Idee ist. Lesen Sie das Open-Closed-Prinzip und hier . Schützen Sie Ihre Funktionalität, aber machen Sie es nicht unmöglich für den Typ, der hereinkommt und es unterstützt ...

    
Mark G 16.01.2009 17:09
quelle
0

Ohne eine letzte Klasse zu verwenden, können Sie grundsätzlich alle Konstruktoren als privat definieren:

%Vor%

Was diese Klasse auch abstrahiert, indem sie das Erstellen eines Objekts dieser Klasse verbietet, aber da jede Vererbung im Konstruktor super(); erfordert und weil der Konstruktor privat ist, ist ein Kompilierungsfehler das Maximum, das Sie haben können get, wenn man versucht, diese Klasse zu erben. Ich würde jedoch empfehlen, final zu verwenden, da es weniger Code enthält und die Option zum Erstellen von Objekten enthält.

    
Eldar Bakerman 22.12.2017 14:20
quelle

Tags und Links