No, questo non è possibile.
Ci sono due modi per limitare l'ereditarietà:
-
La parola chiave final
rende impossibile estendere una classe. Questo modificatore è vietato sulle interfacce e tu vuoi ereditarlo comunque.
-
Visibilità privata del pacchetto significa che solo le classi nello stesso pacchetto possono ereditare dall'interfaccia, ma l'interfaccia stessa non è accessibile al di fuori del pacchetto, il che rende l'interfaccia inutile. Ad esempio, non puoi tenere un oggetto di nessuno di questi sottotipi in una variabile di tipo Bar
. Ciò rende impossibile l'invio dinamico (polimorfismo).
puoi inserire un nuovo AbstractFooBar
simile a questo:
public abstract class AbstractFooBar extends Foo implements Bar {
// Add delegating constructors here
}
Foo
ha solo i binari disponibili. Non puoi aggiungere Bar
come interfaccia che implementa; né puoi richiedere alle sue sottoclassi di implementare Bar
; né puoi limitare Bar
in modo che le classi non aggiunte a Foo
non possano ereditarne. Questo è il più vicino che puoi ottenere. Se non altro, questa è solo una comodità che non impone restrizioni sull'uso di Bar
.
Sebbene questo tecnicamente risponda alla tua domanda, potresti voler fare un passo indietro e riconsiderare esattamente cosa stai cercando di ottenere.
Normalmente quando vedo un requisito per restringere una gerarchia di tipi in questo modo è dovuto al tentativo di ereditare il shoehorn dove la composizione è più appropriata. Entrambe le tecniche hanno i loro posti, ed è meglio non provare a usarne una dove l'altra è più adatta.