Modificatore di accesso di costruttori di classi astratte

2

Quale modificatore di accesso dovrei usare per i miei costruttori in una classe astratta, dato che la classe non può essere istanziata? Sembra che il modificatore di accesso sia superfluo e dovrebbe essere implicitamente protected poiché può essere utilizzato solo all'interno di un costruttore della classe derivata tramite base() .

    
posta rory.ap 19.06.2015 - 15:39
fonte

1 risposta

1

Come hai detto, le tue opzioni sono protected e private .

protected sembra un buon valore predefinito, ma non dimenticare il caso in cui non desideri che le tue sottoclassi invochino un costruttore specifico. Ad esempio:

public abstract class AbstractBase
{
    private AbstractBase(int foo, double bar)
    {
        this.CalculatedProperty = someComplexCalculation(foor, bar);
    }

    protected AbstractBase(string XXX, string YYY, int foo, double bar)
        : this(foo, bar)
    {
        this.XXX = XXX;
        this.YYY = YYY;
    }

    protected AbstractBase(string XXX, int foo, double bar)
        : this(XXX, "There is no YYY.  There is only XXX.", foo, bar)
    {
    }

// *snip*

}

In questo esempio (eccessivamente semplificato), garantiamo che i valori per foo , bar e XXX siano sempre specificati e che CalculatedProperty e XXX siano sempre impostati.

Il costruttore privato ci consente di avere una logica di costruzione condivisa senza duplicazione del codice. E, poiché è privato, le sottoclassi non possono accidentalmente costruirsi parzialmente.

    
risposta data 19.06.2015 - 15:58
fonte

Leggi altre domande sui tag