Classe base con proprietà comuni

0

Ho più classi che hanno le stesse proprietà da esporre. È normale creare una classe base, che espone tali proprietà, da utilizzare con le classi discendenti?

Per proprietà, considero semplice

protected/public bool SomeProperty {get;set;}

ma anche una proprietà complessa che viene iniettata tramite il costruttore

public SomeBaseClass(ISomeDependency dependency)
{
    _dependency = dependency;
}

Questo significa che questa classe base potrebbe essere solo un contenitore stupido, nient'altro.

Questo approccio è corretto?

    
posta Goran 25.07.2018 - 11:08
fonte

2 risposte

5

Sì, il suo 'normale', che sia corretto o meno è una domanda più difficile a cui rispondere.

Dovresti usare l'ereditarietà in cui gli oggetti sono concettualmente una modifica di un tipo di base. Non solo perché capita di avere gli stessi nomi di proprietà.

es .:

class Pet
{
    public string Name {get;set;}
}

buona:

class Kitten : Pet

cattivo:

class Employee : Pet

Il pericolo con il secondo approccio è che si finisce con un'enorme catena di eredità lunga che diventa impossibile da gestire. ad esempio

HasNameAndAddress : Pet
{
    public Address Address {get;set;}
}

Customer : NameAndAddress {}

House : HasAddressButNoName {}
    
risposta data 25.07.2018 - 12:33
fonte
0

Se tutte le classi derivate richiedono le stesse proprietà, prendi in considerazione la creazione di una classe bean (una classe priva di logica aziendale che contiene solo informazioni) e che la tua classe base contenga solo un setter e un getter con tali informazioni.

public class Bean {
    public bool SomePropertyA {get;set;}
    public bool SomePropertyB {get;set;}
    public bool SomePropertyC {get;set;}
}

public class SomeBaseClass {
    protected Bean SomeBean {get; set}
}

In alternativa puoi fare un ulteriore passo avanti e mantenere l'istanza di Bean privata, passandola a metodi sovrascritti:

public abstract class SomeBaseClass {
    public SomeBaseClass(Bean bean) {
        SomeBean = bean;
    }

    private Bean SomeBean {get; set}

    public void DoSomething() {
        DoSomethingInner(SomeBean);
    }

    protected abstract void DoSomethingInner(Bean beanInstance);
}

Questo secondo approccio può essere particolarmente utile se la tua classe viene creata in una fabbrica (e quindi separa la sua creazione da come viene usata nel tuo programma).

    
risposta data 25.07.2018 - 11:51
fonte

Leggi altre domande sui tag