Существует ли соглашение об использовании унаследованных конструкторов - PullRequest
2 голосов
/ 03 июля 2010

Я знаю, что при наследовании классов вы также можете наследовать конструкторы

пример:

class Book : Genre
{
    Book(string param1, int param2, string inherit1, string inherit2) : Base(inherit1,inherit2)
    {
        Prop1 = param1
        Prop2 = param2
    }
}

Но не будет ли проще установить унаследованные свойства с помощью конструктора в унаследованном классе. Вместо ссылки на базовый конструктор?

class Book : Genre
{
    Book(string param1, int param2, string inherit1, string inherit2)
    {
        Prop1 = param1
        Prop2 = param2
        InhProp3 = inherit1
        InhProp4 = inherit2
    }
}

Ответы [ 5 ]

4 голосов
/ 03 июля 2010

Это другое, хотя. Установка свойства не имеет такого поведения.

Когда вы используете конструктор базового класса, который принимает параметры, базовый класс имеет возможность устанавливать эти свойства и потенциально может настраивать поведение на основе этих параметров, которое выполняется до конструктора подкласса.

Если вы установите свойство вручную в конструкторе подкласса, конструктор базового класса уже запущен. Это может изменить поведение - иногда значительно (особенно если базовый класс плохо спроектирован).

Кроме того, если базовый класс требует эту информацию для построения себя, у вас нет выбора. Зачастую параметры конструктора не просто устанавливают свойство класса - они могут иметь решающее значение для построения самого объекта.

3 голосов
/ 03 июля 2010

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

Если вы не будете искать ошибку, найдите ее после нескольких часов отладки. И тогда вы никогда не забудете снова делегировать вызов конструктору базового класса: -)

1 голос
/ 03 июля 2010

Зависит от того, как разработан класс.

Возможно, свойства public get; private set; В этом случае ваш производный класс не имеет доступа для установки свойств.

Кроме того, iircПри вызове конструктора для установки параметров генерируется меньше IL, чем при установке значений в теле вашего конструктора.

1 голос
/ 03 июля 2010

Базовый конструктор может делать больше, чем просто устанавливать свойства, например, он может проверять нулевые ссылки.Если вы сделаете это в наследующем классе, вам придется повторить весь код.Тогда у вас будет один и тот же код в двух местах, поэтому, если код когда-либо будет изменен, вы должны знать, что он должен быть изменен в обоих местах.

1 голос
/ 03 июля 2010

Базовый класс может делать больше, чем просто устанавливать свойства. Базовый класс может быть классом, к которому у вас нет исходного кода, поэтому вы даже не знаете, что с ним делать.

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