Classe astratta + Ereditarietà vs Interfaccia

5

Salve colleghi programmatori,

Sto leggendo un libro su C # e l'autore sta confrontando le classi e le interfacce astratte. Afferma che se hai la seguente "classe astratta:"

abstract class CloneableType
{
public abstract object Clone();
}

Quindi non puoi fare questo:

public class MiniVan : Car, CloneableType
{}

Questo, capisco. Tuttavia, afferma che a causa di questa impossibilità a fare ereditarietà multiple si dovrebbe usare un'interfaccia per CloneableType, in questo modo:

public interface ICloneable
{
object Clone();
}

La mia domanda è, non è un po 'fuorviante, perché puoi creare una classe astratta che è "sopra" di classe Car con il metodo Clone, poi avere Car ereditare quella classe e poi Minivan erediterà Car con tutti questi metodi, Classe CloneAble - > Classe auto - > Classe Minivan.

Che ne pensi? Grazie.

    
posta RealityDysfunction 30.09.2012 - 04:40
fonte

4 risposte

8

La differenza tra le classi astratte e le interfacce nel tuo caso potrebbe consentire allo sviluppatore di definire bene lo schema del tuo progetto con una classe astratta creare una relazione "is a" e un'interfaccia creare una relazione "può fare".

Mettilo in questo modo, se hai una macchina giocattolo e non avrebbe senso farli "è una" relazione con Minivan dato che puoi usare l'interfaccia per mostrare un comportamento specifico della macchinina come la tolleranza alla resistenza all'acqua.

Quindi puoi definire il tipo:

public Interface IToyCarResistance
{
  int ToleranceLevel { get; }
}

public class ToyCar : Car , IToyCarResistance
{
}
    
risposta data 30.09.2012 - 05:40
fonte
3

L'idea che l'autore sta cercando di sottolineare è che la progettazione di una classe astratta anziché un'interfaccia limita la tua capacità di mescolare e abbinare quella classe con altre parti del tuo sistema in un secondo momento. Questo è un compromesso tra la capacità di condividere un'implementazione in cambio dell'incapacità di combinare più classi astratte in seguito.

    
risposta data 30.09.2012 - 05:45
fonte
3

Risposta breve: l'autore sta semplicemente enfatizzando che una classe può ereditare solo da una, e SOLO una classe base . Tuttavia, potrebbe avere come molte interfacce se necessario. Questo è vero per i linguaggi C #, VB.NET.

Tuttavia, potresti avere un set di classi che ne ereditano uno da un altro. Puoi anche creare ereditarietà di modifiche, che dovrebbero essere progettate con cura e meglio evitabili.

Per farla breve, le interfacce sono molto utili per propagare i comportamenti comuni (azioni come Crea, Aggiorna, Elimina, ecc.) alle classi.

    
risposta data 30.09.2012 - 05:33
fonte
-1

Le classi astratte vengono utilizzate per "impostare" qualsiasi classe che è stata ereditata da esso, il che significa che può avere implementazioni predefinite delle sue proprietà e metodi che erediteranno tutte le classi derivate. Ad esempio, se una classe derivata erediterà l'implementazione predefinita startEngine, ma non necessariamente dovrà implementare la propria versione, può utilizzare la propria versione della classe base startEngine e l'interfaccia non può avere alcun metodo completato e richiederebbe di definire il tuo in ogni caso. Ciò consente in molti casi una migliore riutilizzabilità del codice, dal momento che l'implementazione predefinita ha tutti i metodi e le proprietà predefiniti se si modifica qualcosa nella classe derivata che probabilmente non interromperà il codice precedente, dove come con un'interfaccia, si deve andare comunque e trovare tutte le istanze in cui viene utilizzata l'interfaccia e apportare le modifiche.

    
risposta data 07.08.2013 - 18:58
fonte

Leggi altre domande sui tag