Devo usare l'ereditarietà o un'interfaccia?

1

Quindi in poche parole ho una classe astratta:

public abstract class Member  
{
public string PCode { get; set; }
public string Reference { get; set; }
public DateTime? ElectedDate { get; set; }
}

E questo è ereditato da 3 altre classi:

public class Fellow : Member
{
 // some class level properties here
}
public class ForeignMember : Member
{
 // some class level properties here
}
public class HonoraryMember : Member
{
 // some class level properties here
}

E le normali operazioni CRUD vengono eseguite utilizzando un modello di repository generico:

Interfaccia

public interface ICRMRepository<T>
{
    List<T> GetAll();
    T GetById(int id);
    T GetByPCode(string pcode);
}

Class

public class CRMRepository<T> : ICRMRepository<T> where T : class
{

   public List<T> GetAll()
   {
    //actions go here
   }

   public T GetById(int id)
   {
    //actions go here        
   }

   public T GetByPCode(string pcode)
   {
    //actions go here
   }
}

La domanda è se volessi fare una query che riportasse tutti i Fellows, HonoraryMembers e ForeignMembers in un set di risultati, come potrei fare questo?

Sarebbe meglio avere un'interfaccia invece dell'eredità, ad es. Imember, e quindi le tre classi usano quell'interfaccia? O qualche soluzione che usa entrambi?

    
posta user3096080 15.04.2014 - 17:31
fonte

1 risposta

1

Normalmente otterrai una percentuale di ICRMRepository<Member> e esegui una query in tal senso se desideri tutto Members e all'interno del ciclo controllerai il loro tipo effettivo:

foreach(Member member in memberRepository.GetAll())
{
    // do stuff here that you can do for all Members, then...
    if(member is HonoraryMember)
    {
        var honoraryMember = member as HonoraryMember;
        // do stuff here that you only do to HonoraryMembers...
    }
}

Affinché funzioni, dipende dalle capacità del tuo repository. Il tuo repository generico Member deve restituire effettivamente le istanze della classe corretta. Non tutte le implementazioni di repository fanno questo, ma il tuo potrebbe.

La maggior parte delle implementazioni utilizza tipi concreti per le entità, ma la tua idea di utilizzare le interfacce ( IMember ) è davvero la pena di essere esaminata. Ho scritto una piccola applicazione che utilizzava interfacce per le mie entità e mi è davvero piaciuto. Finisci con alcuni vantaggi interessanti, come il tuo metodo Insert può prendere un'istanza di NewMember e le tue query possono restituire istanze di ExistingMember (che traccia le modifiche a se stesso) ed entrambi potrebbero implementare l'interfaccia IMember .

    
risposta data 15.04.2014 - 17:45
fonte

Leggi altre domande sui tag