2013-05-31 16 views
12

Ultimamente sto pensando di creare la mia libreria Date. E sto riscontrando un problema qui, eccolo:Come nascondere completamente il metodo superclasse in Java

Come nascondere un metodo di superclasse nella sottoclasse? Quindi non verrà rilevato nella sottoclasse.

Esempio: Ho una classe che si estende fino alla data e un'altra classe che si estende alla classe precedente. Nella mia nuova sottoclasse, rileva tutti i metodi da Data, come getDate, ecc. Quello che voglio è che nella mia sottoclasse tutti i metodi da Data non vengano rilevati, non lanciando un'eccezione, ma completamente non rilevati.

Grazie in anticipo :)

+1

Non c'è modo di farlo ... L'unica soluzione sarebbe quella di avere il metodo con lo stesso nome di essere 'private' nella classe genitore, ma significa che non è richiamabile da nessun'altra parte rispetto alla classe genitore. – fge

+0

Ho provato a sovrascrivere il getDate in privato nella mia superclasse, ma mi dà un errore, che dovrei cambiarlo in pubblico. La delega –

risposta

24

Favorisci la composizione sull'ereditarietà qui.

Invece di ereditare un Data hanno come campo membro all'interno del vostro MyDate classe.

public class MyDate { 
    private Date dt = new Date(); 

    // no getDate() available 

    public long getTime() { 
     return date.getTime(); 
    } 
} 

si ottiene il controllo completo sul API Data che è visibile ai vostri sottoclassi (senza la necessità di lanciare eventuali eccezioni), ma questo approccio è più pratico quando i metodi che si vogliono nascondere più numerosi quelli che si desidera rimanere accessibili .

+0

Hmm, Joda Date usa uno schema come questo? Perché il suo tipo di ritorno è DateTime e non Date, sebbene esista un metodo in grado di convertirlo in Data. –

+0

Questo è il bello. Hai il controllo completo sull'API. Dai nomi dei metodi ai tipi restituiti. Puoi scegliere di semplificare e/o limitare l'API come desideri. –

+0

Ok, sto trovando che questa è la risposta più vicina al mio problema, sto cercando di capire la logica. A proposito @Ravi -san, sai perché quando ho questo 'Data d = new Date(); System.out.println (d); ' Produrrà un output come _Sat Jun 01 04:44:47 ICT 2013_. Ma quando dichiaro il mio oggetto di classe come 'MyClass mc = new MyClass(); System.out.println (mc); Produce un output come [email protected]_ Come faccio ad avere un output come oggetto Date quando esco dall'oggetto di classe? –

8

Non si può nascondere che, se è esteso, ma è possibile ignorare.

se volete che il vostro utente API di non utilizzare il metodo suggerisco un override e basta gettare questa eccezione:

UnsupportedOperationException 

ma guardando quello che hai scritto, si dovrebbe considerare la possibilità data un campo nella classe, non estendere la classe.

4

è possibile utilizzare la delega invece

public class NewDate{ 
    Date d; 
    NewDate(){ 
    d = new Date(); 
    } 

    methodsYouWantToChange(){ 
    // new implementation 
    } 


    methodsYouDontWantToChange(){ 
    d.methodsYouDontWantToChange(); 
    } 


    newMethods(){ 
    // new implementation 
    } 
} 
+1

può essere una soluzione perfetta, lombok può anche renderlo pulito: http://projectlombok.org/features/Delegate.html – Vegard

+0

Questa delega non consentirebbe alla mia classe di avere un tipo di ritorno di una data, vero? –

+0

@ A-SM perché no ?? – stinepike

5

non è possibile.

Se quello che volevi era possibile, allora l'ereditarietà sarebbe stata infranta. All'improvviso, quando si utilizza un determinato tipo IS-A di Date, non sarà possibile chiamare alcun metodo di tipo Date. Questo è sbagliato a diversi livelli. Ad esempio, si rompe il Liskov Substitution Principle.

0

override del metodo e renderlo statico, nasconderà il metodo di super classe

Problemi correlati