2011-08-09 11 views
7

Ho alcune classi che devo essere in grado di estendere all'interno dello stesso pacchetto. Ma non voglio che nessun altro al di fuori del mio pacchetto estenda le mie lezioni. Le classi in altri pacchetti devono essere in grado di chiamare le mie classi, quindi non posso usare 'default'.Posso limitare l'ereditarietà al pacchetto senza utilizzare 'default'?

C'è qualche modo (magari attraverso un'interfaccia) che io possa ottenere questo?

risposta

6

Farei questo creando una classe base con visibilità default, quindi estendila con una classe public final che le classi esterne possono chiamare ma non estendere. Per esempio:

class MyBase { 
    public void doSomething() { ... } 
} 

public final class PublicBase extends MyBase { } 

class ExtendedBase { 
    @Override 
    public void doSomething() { ... } 
} 
7

Se fate il vostro pacchetto di costruttori locali, può essere esteso solo nella stessa confezione tuttavia membri pubblici si può accedere in qualsiasi classe se si tratta di una classe pubblica.

+2

Questa è un'ottima soluzione perché consente anche la classe base di essere visibile all'esterno del pacchetto. – jzd

+0

Ho bisogno che le classi in altri pacchetti siano in grado di creare un'istanza della mia classe. Non impedirebbe a tutti i costruttori locali di impedirlo? – Florian

+0

È possibile utilizzare i metodi di fabbrica per consentire l'istanziazione. –

0

È possibile creare un'interfaccia per l'utilizzo della classe e una classe factory che restituisca implementazioni concrete, che saranno entrambe pubbliche e quindi visibili al di fuori del pacchetto. Quindi crea le tue lezioni concrete con visibilità predefinita.

Problemi correlati