Come dichiarare i costruttori nelle classi di base in modo che le sottoclassi possano usarli senza dichiararli?

StackOverflow https://stackoverflow.com/questions/8869503

Domanda

Voglio che una sottoclasse utilizzi i costruttori dei suoi genitori. Ma sembra che ho sempre bisogno di definirli di nuovo nella sottoclasse affinché funzioni, così: così:

public SubClass(int x, int y) : base (x, y) {
    //no code here
}

Quindi mi chiedo se non sto dichiarando correttamente il costruttore nella classe genitore o non esiste affatto ereditarietà del costruttore diretto?

È stato utile?

Soluzione

Non stai facendo nulla di sbagliato.

In C#, i costruttori di istanza non vengono ereditati, quindi dichiararli sul tipo ereditario e concatenare al costruttore di base è il modo giusto.

Dalla specifica §1.6.7.1:

A differenza di altri membri, i costruttori di istanza non sono ereditati e una classe non ha costruttori di istanza diversi da quelli effettivamente dichiarati nella classe. Se non viene fornito alcun costruttore di istanza per una classe, allora viene automaticamente fornito uno vuoto senza parametri.

Altri suggerimenti

So che questo non risponde direttamente alla tua domanda; Tuttavia, se la maggior parte dei costruttori introduce semplicemente un nuovo parametro sul costruttore precedente, è possibile sfruttare gli argomenti opzionali (introdotti in C# 4) per ridurre il numero di costruttori necessari per definire.

Per esempio:

public class BaseClass
{
    private int x;
    private int y;

    public BaseClass()
        : this(0, 0)
    { }

    public BaseClass(int x)
        : this(x, 0)
    { }

    public BaseClass(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass()
        : base()
    { }

    public DerivedClass(int x)
        : base(x)
    { }

    public DerivedClass(int x, int y)
        : base(x, y)
    { }
}

Quanto sopra può essere ridotto a:

public class BaseClass
{
    private int x;
    private int y;

    public BaseClass(int x = 0, int y = 0)
    {
        this.x = x;
        this.y = y;
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass(int x = 0, int y = 0)
        : base(x, y)
    { }
}

E ti permetterebbe comunque di inizializzare entrambi BaseClass e DerivedClass Con un numero qualsiasi di argomenti:

var d1 = new DerivedClass();
var d2 = new DerivedClass(42);
var d3 = new DerivedClass(42, 43);

I costruttori non sono ereditati dalla classe base a derivati. Ogni costruttore deve prima chiamare la classe di base. Il compilatore sa solo come chiamare CTOR senza parametri. Se non esiste un tale cTOR nella classe base, devi chiamarlo manualmente.

Quindi mi chiedo se non sto dichiarando correttamente il costruttore nella classe dei genitori, perché sembra sciocco.

Se la classe di base non ha un costruttore predefinito, è necessario ridipingerlo nella classe figlio. Ecco come funziona OOP in .NET.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top