Ja, Java werden Sie nur für die Zwecke der Aliasing der ursprünglichen Klasse eine nicht final
konkrete Klasse lassen Unterklasse.
public class Foo { /* implementation */ }
public class Bar extends Foo {}
, dass die minimale Umsetzung wäre, vorausgesetzt, dass es nur ein Standard-Konstruktor in Foo
ist. Wenn es Konstrukteuren, die Argumente in Foo
nehmen, dann müssen Sie jedem Konstruktor einen Konstruktor in Bar
für bieten Sie planen, rufen Sie Ihren Bar
Instanzen zu erstellen, zB:
public class Foo {
public Foo(String baz) { /* constructor implementation */ }
}
public class Bar extends Foo {
public Bar(String baz) { super(baz); }
}
Alle nicht private
Methoden in Foo
wird vererbt werden von Bar
.
Der einzige Ort, an dem es möglicherweise nicht funktioniert, ist, wenn Sie Bar
anstelle von Foo
als generischen Typparameter verwenden möchten.
Zum Beispiel, wenn Sie ersetzen ein List<Foo>
mit einem List<Bar>
, dann List
nicht mehr halten alle Foo
Instanzen oder Instanzen einer anderen Klasse, die Foo
verlängern könnte.
Darüber hinaus, da Java-Generika-invariant sind, ist ein List<Bar>
nicht ein Subtyp von List<Foo>
, auch wenn ein Bar
ein Foo
ist. Details dazu, warum das der Fall ist, finden Sie unter Is List a subclass of List? Why aren't Java's generics implicitly polymorphic?. Vielleicht können Sie auch umgehen, wenn Sie List<? extends Foo>
verwenden, so dass Sie eine oder eine List<Bar>
verwenden können, aber dann können Sie nicht add
alles andere als null
.
Sie geben an, dass Sie es nicht in Generika verwenden werden, aber es sollte berücksichtigt werden, wenn Ihre Anforderungen erweitert werden.
Zusammenfassend, ja, der Java-Compiler wird Sie tun, aber mit einer begrenzten Oberseite - mit Bar
anstelle von Foo
als Alias - und ein potenzieller Nachteil sehe ich keinen Grund, diesen Alias-Prozess zu verwenden.
Ich glaube, Sie müssen auf Konstruktoren achten, aber es gibt keine Verpflichtung, Methoden einer Elternklasse außer Kraft zu setzen, es sei denn, die Eltern sind abstrakt. – KevinO
Würden Sie "Foo" oder "Bar" als generischen Typparameter verwenden, z. 'Liste'? –
rgettman
@rettman nein nur ein Alias für einen graduellen Refactor – mfrankli