2011-08-25 14 views
6

A volte, mi sono imbattuto in qualche progetto di classe come segue.Scopo di avere figli astratti estendendo il genitore concreto

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Do something. 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

Mi chiedevo, qual è lo scopo di avere una classe abstract_dog? Perché "trasformiamo" il metodo di parlare non astratto in astratto, parliamo ancora?

+0

Nota: se si controlla la gerarchia delle classi, un approccio migliore potrebbe consistere nell'eliminare completamente la classe cane concreto o nella sottoclasse abstract_dog. Preferisci rendere astratte le classi non fogliari. –

risposta

4

Nel caso in cui si desideri creare una classe base che obbliga le persone a sovrascrivere speak, ma eredita Dog.

+0

Mentre la tua risposta è tecnicamente corretta, considererei ancora questo un odore di codice, se lo trovassi durante la revisione .. (Ancora +1) – nfechner

+0

@nfechner: Dipende completamente dalla situazione specifica. Penso di aver avuto bisogno di fare esattamente questo in più di 5 anni di sviluppo. – SLaks

+0

+1 per il semplice motivo, sebbene la tua risposta (oltre alla domanda) manchi di una situazione reale. –

0

Concordo con SLaks, e pensare che questa sarebbe una vera e propria situazione di vita:

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Dog says 'bark' 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

class poodle extends abstract_dog { 
    @Override 
    public void speak() { 
     // poodle says 'yip yip' 
    } 
} 

class great_dane extends abstract_dog { 
    @Override 
    public void speak() { 
     // great dane says 'ruff ruff' 
    } 
} 

Penso che si può usare questo nel caso in cui si desidera che la rendono una nuova classe figlia implementare il metodo speak e la classe dog potrebbe avere altri metodi che la nuova classe figlio non dovrà implementare.
Sapere di più sulla tua esatta situazione ti aiuterà a determinare se esiste un design migliore per questo scenario.

+0

Ma in questo esempio si può anche saltare abstract_dog. – Buhb

+0

@Buhb, è vero, ed è un potenziale problema con questo design. – rosscj2533

Problemi correlati