2010-07-05 15 views
16

Ho deciso di iniziare da solo piccoli progetti di codifica che si concentrano sulla qualità del codice anziché sulla quantità di codice e ho una domanda sull'uso delle classi astratte.Vantaggi dell'uso di classi astratte rispetto alla classe regolare

Ora so le differenze tra le classi astratte e le interfacce con il più grande (credo) è che l'interfaccia consentono di definire solo i metodi che devono essere implementati dalle classi che utilizzano l'interfaccia e classi astratte che consente di definire sia il metodo e membri insieme all'implementazione del metodo predefinito, se lo desideri. La mia domanda è quale sia il vantaggio principale di utilizzare una classe astratta rispetto a una classe normale? L'unica vera differenza tra i due che posso pensare è che non è possibile creare un'istanza di una classe astratta. Ci sono altre differenze tra i due?

+7

Saranno i downvoters si prega di indicare il motivo per cui si downvote risposte?!?! – apollodude217

risposta

14

Strettamente dal punto di vista del design, è meglio semplificare le cose. Credo che il modo migliore per semplificare le cose sia usare una semplice analogia. Usiamo un'analogia di uccelli ...

Interfaccia: utilizzare questa opzione quando si desidera applicare determinate funzioni che devono essere definite. per esempio. IBird ha un contratto per ScreamLikeABird e Fly (funzioni di interfaccia). Ma puoi diventare più specifico e avere un IOstrich con un contratto Run. Potresti anche avere un IHawk con un contratto di attacco ... ecc.

Astratto: utilizzare questo quando si desidera applicare le funzioni di base e avere proprietà di base. per esempio. Avian potrebbe essere una classe base per gli uccelli che possono avere una funzione chiamata LayEgg e proprietà denominate Age, Species, NumberOfChicks ... ecc. Queste cose non/non dovrebbero cambiare il comportamento di un uccello, dal momento che tutti gli uccelli depongono le uova ... ecc. Ma non tutti gli uccelli suonano allo stesso modo quando urlano o vola allo stesso modo (alcuni non volano nemmeno) .... ecc .... quindi dovrebbero essere implementati tramite un'interfaccia (s).

+26

-1 per analogie animaliose e confuse. –

+6

L'impraticabile analogia animale è stata utilizzata per alleviare la confusione di "interfaccia vs astratto". A proposito, quanto è impraticabile qualsiasi interpretazione di Hello World? La praticità non ha nulla a che fare con questo. Inoltre, posso vedere questa analogia estremamente pratica in molte applicazioni e/o giochi. – AlvinfromDiaspar

+0

@AlvinfromDiaspar +1 Beh, penso che sia la spiegazione più semplice del mondo – Rohit

-2

Le classi astratte possono essere utilizzate per memorizzare i metodi in una "libreria" basata su OOP; dal momento che la classe non ha bisogno di essere istanziata, e avrebbe poco senso per essere, mantenere i metodi statici comuni all'interno di una classe astratta è una pratica comune.

+0

"In Java, puoi anche dichiarare la classe come definitiva, in modo che non sia estensibile." No, non puoi. 'abstract' +' final' non è permesso. Se la tua classe è destinata esclusivamente ai metodi di utilità statica, dovrebbe probabilmente essere una classe finale con un costruttore privato (non utilizzato). –

+0

@Matthew Flaschen: punto preso. Grazie per il chiarimento. – amphetamachine

+1

I metodi statici non sono la ragione principale delle classi astratte. – apollodude217

8

Oltre a non essere in grado di creare istanze di classi astratte, alcuni linguaggi potrebbero supportare l'utilizzo di metodi astratti in classi astratte: simili alle interfacce, un metodo astratto dovrà essere implementato dalla classe che eredita dalla classe astratta.

Il vantaggio principale delle classi astratte secondo me è se esiste un codice che deve essere condiviso tra classi dello stesso tipo. Di solito è possibile utilizzare un'interfaccia per questo, ma a volte la funzionalità di tali classi potrebbe sovrapporsi e si finirebbe con la duplicazione del codice. In questo caso puoi usare una classe astratta e inserire il codice lì.

+3

+1 per una risposta breve e corretta. – apollodude217

+0

Anche se a una classe non capita di avere membri astratti e le istanze create hanno un comportamento ben definito, può essere ragionevole definire la classe come astratta se non contiene nulla che distingua le istanze l'una dall'altra. Ad esempio, si potrebbe definire una 'classe di base ImmutableList ' con sottoclassi per 'ArrayBackedImmutableList ', 'ComputedImmutableList ', 'LazyImmutableList ', ecc. Mentre potrebbe essere possibile che istanze di classe base si comportino come elemento zero elenco, sarebbe più pulito definire una classe 'EmptyImmutableList ' concreta per tale scopo. – supercat

-1

Questo potrebbe aiutare, Consente di considerare viaggiatore che può utilizzare qualsiasi tipo di veicolo cioè auto, ciclo, moto ecc ...
ma tutti i veicoli si muove nello stesso modo con diversi vincoli di velocità in modo che possiamo avere uno

abstract class Avehicle  
{ 
     string fuel; 
     public void move() 
{ 
sysout("moving"); 
} 
} 

ma tutti i veicoli sistema di rottura è diverso

interface Ivehicle  
{ 

     public void breakorstop(); 
} 
class Traveler  
{ 
    Ivehicle v; 
//Settrers and getters 
public drive() 
{ 
v.move(); 
} 
public break() 
{ 
v.breakorstop(); 
} 
} 

Così alla fine auto o classi del ciclo o in bicicletta possono estendersi avehicle e può implementare Vehicl e interfaccia

6

Nel mondo OO, classi astratte utilizzate per imporre alcuni vincoli di implementazione del progetto &. Niente di più. Non devi mai usare classi astratte in ogni caso. Ma potrebbero esserci casi in cui è meglio imporre questi vincoli. Quindi cosa sono?Diamo un'occhiata confrontando le sue oo-controparti.

classi astratte vs interfacce

Come sapete, questi sono due dei concetti primari di ereditarietà.

Fondamentalmente, l'interfaccia viene utilizzata solo per dichiarare che si è disposti ad ereditare il servizio sottostante e il gioco è fatto. Non contiene alcuna implementazione & non ha alcuna funzionalità. In questo senso, l'interfaccia è astratta. Ecco perché è più un vincolo di progettazione che un vincolo di implementazione. Pensa a un jack per cuffie su un altoparlante. Ogni cuffia deve implementare l'interfaccia jack (con start, stop, listen, turnDown, metodi turnUp). Ogni cuffia dovrebbe ignorare questa interfaccia per ereditare le funzionalità che l'altoparlante fornisce e implementare di conseguenza.

Le classi astratte, d'altra parte, possono includere metodi con un'implementazione. Questa è la differenza fondamentale e in questo senso può utilizzare riutilizzare più di un'interfaccia. Inoltre, possono contenere campi non statici protetti, protetti da & che non è possibile tramite interfacce. È possibile forzare le sottoclassi per implementare alcune funzionalità must-have con metodi astratti (quelli senza implementazioni). Classi astratte più agili delle interfacce.

Naturalmente per non parlare di estendere una classe in java in cui è possibile implementare il numero di interfacce.

classi astratte vs classi regolari

Allora perché non utilizzare le classi regolari, allora. Qual è il vantaggio dell'uso della classe astratta? Questo è piuttosto semplice. Se si utilizzano classi astratte, si forza la funzionalità di base da implementare dai fratelli. Come sviluppatore, non è necessario ricordare che è necessario implementare le funzioni essenziali. È qui che le classi astratte impongono vincoli di progettazione rispetto alle classi regolari. Inoltre, rendendo l'abstract della classe, si evita che tale classe (incompleta) venga creata accidentalmente.

+0

Per ** fratelli ** intendi bambino, considerando che l'astratto sarà ereditato da una classe che lo rende un genitore. Destra ? –

+0

@DaniyalNasir si. – zgulser

0

Classi astratte vs Classi regolari vs Interfaccia. La classe astratta di solito supporta un'idea di generalizzazione e di contribuire dai programmatori a mantenere una discreta disfunzione del cervello progettando progetti pluriennali perché quando includono un metodo astratto devono descrivere un'implementazione che metodi astratti nelle classi subling, tuttavia, questa caratteristica è uno svantaggio per progetti a breve termine quando uno sviluppatore ha uno zeitnot.

0

L'unica ragione per dichiarare una classe come astratta è che non può essere istanziata. Ci sono situazioni in cui avrai funzionalità comuni condivise tra un certo numero di classi, ma di per sé che la funzionalità comune non rappresenta un oggetto o rappresenta un oggetto incompleto. In tal caso, si definisce la funzionalità comune come astratta in modo che non possa essere istanziata.

+0

Cosa c'è che non va ??? –

1

a mio avviso le classi astratte hanno più utilità nei progetti reali come nei libri. alcune volte i project manager forniscono solo la dichiarazione dei metodi e si deve scrivere il codice per i metodi senza modificare la sintassi principale fornita dal manager. è così che una classe astratta è piena. nel metodo di classe semplice definire, dichiarare e codificare nello stesso tempo ma non in classi astratte. per es: -

abstract class Test 
{ 
    abstract void show();//method provided 
} 
class Child extends Test 
{ 
    void show()//coding 
    { 
     System.out.println("saurav"); 
    } 
} 
class main 
{ 
    public static void main(String[] args) 
    { 
    Test c = new Child(); 
    c.show(); 
    } 
} 
Problemi correlati