Как объявить конструкторы в базовых классах, чтобы подклассы могли использовать их, не объявляя их? - PullRequest
3 голосов
/ 15 января 2012

Я хочу, чтобы подкласс использовал конструкторы своего родителя.Но, кажется, мне всегда нужно снова определять их в подклассе, чтобы это работало, например:

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

Так что мне интересно, не правильно ли я объявляю конструктор в родительском классеили нет прямого наследования конструктора вообще?

Ответы [ 4 ]

9 голосов
/ 15 января 2012

Вы не делаете ничего плохого.

В C # конструкторы экземпляров не наследуются, поэтому правильное объявление их в наследующем типе и цепочка к базовому конструктору.1004 * из спецификацииЕсли конструктор экземпляра не предоставлен для класса, то автоматически предоставляется пустой конструктор без параметров.

4 голосов
/ 15 января 2012

Я знаю, что это не дает прямого ответа на ваш вопрос;однако, если большинство ваших конструкторов просто вводят новый параметр в предыдущем конструкторе, вы можете воспользоваться дополнительными аргументами (введенными в C # 4), чтобы уменьшить количество конструкторов, которые вам нужно определить.

Например,:

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)
    { }
}

Вышеприведенное может быть уменьшено до:

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)
    { }
}

И оно все равно позволит вам инициализировать BaseClass и DerivedClass с любым количеством аргументов:

var d1 = new DerivedClass();
var d2 = new DerivedClass(42);
var d3 = new DerivedClass(42, 43);
3 голосов
/ 15 января 2012

Конструкторы не наследуются от базового класса к производному.Каждый конструктор должен сначала вызвать базовый класс ctor.Компилятор знает только, как вызвать ctor без параметров.Если в базовом классе такого ctor нет, его нужно вызвать вручную.

1 голос
/ 15 января 2012

Так что мне интересно, правильно ли я объявляю конструктор в родительский класс, потому что это кажется глупым.

Если базовый класс не имеет конструктора по умолчанию, вы должны переопределить его в дочернем классе. Вот как ООП работает в .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...