Come rendere le interfacce utilizzabili solo per classi speciali?

0

C'è un modo per rendere le interfacce Java implementabili solo da classi di un tipo speciale?

Quindi, ad esempio, ho una classe Foo e un'interfaccia Bar . Solo le sottoclassi di Foo dovrebbero essere in grado di implementare Bar . È possibile?

(Ciò sarebbe utile se sottoclassi di Foo sono le uniche classi che hanno bisogno di per implementare Bar . Altre classi che non hanno realmente bisogno di implementarle semplicemente non possono.)

Prima di chiedere, non posso modificare Foo per aggiungere i metodi lì, è binario.

    
posta Binary 19.04.2016 - 19:13
fonte

1 risposta

1

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.

    
risposta data 19.04.2016 - 21:38
fonte

Leggi altre domande sui tag