Se una proprietà si trova in una classe astratta se non direttamente utilizzata

1

Ho una classe base astratta che è ereditata da diversi altri tipi. Stavano tutti usando un tipo iniettato nel loro costruttore. Così ho spostato questa proprietà nella classe base astratta. La classe base non la usa in nessuno dei suoi metodi. Tuttavia è usato in ognuna delle classi ereditarie. Dovrebbe essere nella classe base o dichiarata separatamente nelle altre classi?

public abstract class FooBase
{
    protected TypeA a {get;}

    protected FooBase(TypeA a)
    {
        this.a = a;
    }
}

public class FooA : FooBase
{
    public FooA(TypeA a) : base (a)
    {
    }

    public void SomeMethod()
    {
        a.DoSomething();
    }
}
    
posta DasDave 19.09.2018 - 10:56
fonte

3 risposte

2

Non c'è niente di sbagliato in questo.

Il fatto che sia una classe astratta in sé significa che mancano componenti. A volte questi componenti sono istruzioni mentre altri componenti sono dati. Questo sarebbe semplicemente un esempio di un'istruzione mancante di classe astratta.

Stai semplicemente stabilendo che tutte le classi che derivano dalla tua classe base devono fornire un'istanza TypeA in qualche forma o forma.

Tuttavia, detto questo, sarebbe errato per ogni classe derivata che non usasse questa istanza. Se ti trovi in questa situazione, dovresti rivalutare la relazione tra le tue classi. Il posto dove mettere le classi che non richiedono TypeA è sopra la tua classe base astratta, non al di sotto di essa.

    
risposta data 19.09.2018 - 11:10
fonte
1

La risposta è dipende ...

È TypeA specifico per FooA, o potrebbero esserci implementazioni aggiuntive, ad es.

public class FooB : FooBase
{
}

che fa anche riferimento alla proprietà TypeA?

In generale, proprietà / metodi dovrebbero essere dichiarati in una classe genitore comune, piuttosto che più volte nei discendenti, ma una classe genitore dovrebbe contenere solo gli elementi richiesti da tutti i suoi figli.

    
risposta data 19.09.2018 - 11:08
fonte
1

Sì, un punto importante di avere classi base è ridurre la duplicazione. Il punto che la classe base non usa effettivamente un campo o un metodo non conta contro di essa - tecnicamente, se una classe base è astratta, non in realtà usa qualsiasi della sua funzionalità, ma ciò non significa che le classi astratte non siano utili.

    
risposta data 19.09.2018 - 11:09
fonte

Leggi altre domande sui tag