Interfacce vs Classe base [duplicato]

0

Sto cercando di capire quando usare una classe base con Polymorphism o un'interfaccia.

Se il mio oggetto espone DoThis () allora non riesco a capire perché è importante se si tratta di un'interfaccia di una classe base.

Tieni presente quanto segue

public void MyMethod()
{
    var myObject = new MyObject();
    myObject.DoThis();
}

Riguardo a MyObject, avrei potuto crearlo in 2 modi

Approccio 1

public class MyObject : IMyInterface
{
    public void DoThis()
    {
        //logic
    } 
}

Approccio 2

public class MyObject : MyBaseObject
{
    public override void DoThis()
    {
        //logic
    } 
}

Da quello che posso vedere, entrambe le implementazioni raggiungono la stessa cosa.

Il problema potrebbe essere il mio esempio è troppo semplice / inventato ma, c'è un modo per sapere quando utilizzare un approccio rispetto all'altro? Nel mio esempio sopra, vorrei indovina la risposta è la preferenza? Non ho mai fatto progetti importanti prima e quindi immagino che uno non sia così estensibile ma non so perché lo penso!

    
posta MyDaftQuestions 12.02.2014 - 12:20
fonte

3 risposte

1

Una classe base ti consentirà di condividere le reciproche funzionalità. Nel tuo esempio, non c'è un'enorme differenza. Tuttavia, immagina di avere più di un metodo sulla tua classe.

public abstract class MyBaseClass
{
   public virtual void DoThat()
   {
      //do something cool
   }

   public abstract void DoThis();
}

Se lo avessi implementato su un calcestruzzo usando un'interfaccia, non una classe astratta, allora avresti dovuto scrivere la funzionalità per entrambi i metodi.

Se utilizzi una classe astratta o erediti da un'altra classe, devi solo scrivere il codice per DoThis() .

DoThat() fa già qualcosa di interessante, non c'è motivo di riscriverlo su ogni implementazione concreta. Come è virtuale, se è necessario sostituirlo, è possibile.

    
risposta data 12.02.2014 - 12:27
fonte
3

In C #, ci sono due (principali) cose che differiscono tra le interfacce e le classi astratte:

  1. Puoi implementare più di un'interfaccia, ma solo una classe.
  2. Per poterlo fare, non puoi fare alcune cose in un'interfaccia che puoi fare sulla classe base - più comunemente, implementare qualsiasi tipo di implementazione standard / comune.

Una nuova avvertenza è che in .net 3.5 e successive, è possibile creare metodi di estensione per le interfacce. Questo può fornire un comportamento comune o predefinito per i metodi di istanza , ma non per altri membri.

La maggior parte delle persone dirà di creare un'interfaccia finché non avrai bisogno delle funzionalità di un tipo di base astratto. Invito a un approccio diverso:

Certamente ci saranno momenti in cui le differenze funzionali costringeranno la tua mano, ma la scelta guida anche gli utenti nell'uso dei tuoi tipi. Usa le interfacce quando stai descrivendo concettualmente un tratto o qualche proprietà da implementare. Qualcosa che possa essere attuato insieme ad altre interfacce senza violare il principio di responsabilità unica. Le interfacce descrivono cosa può fare qualcosa, non quale è . Dall'altra parte, le classi di base astratte dovrebbero essere utilizzate quando si definisce il nucleo essenziale di alcune cose. Gli eredi sono la classe astratta e sarebbe sbagliato essere esso e qualsiasi altra cosa.

Questo approccio guida le persone a utilizzare correttamente il codice comunicando una migliore visione mentale del progetto. Inoltre, poiché utilizza un modello migliore, è più probabile che le modifiche future funzionino correttamente (quante volte è necessario aggiungere funzionalità all'interfaccia, ma non è possibile perché è stata un'interfaccia?).

    
risposta data 12.02.2014 - 13:48
fonte
0

Tre possibili scenari:

  1. erediti da una classe base quando vuoi estendere e / o perfezionare il comportamento corrente della classe base

  2. implementa un'interfaccia quando vuoi che la tua classe rispetti il contratto specificato da tale interfaccia.

  3. Altrimenti, puoi fare perfettamente né l'una né l'altra.

In entrambi e tre i casi si finisce con una classe che implementa gli stessi metodi. È interamente una questione di semantica.

    
risposta data 12.02.2014 - 13:12
fonte

Leggi altre domande sui tag