В .NET класс может иметь виртуальный конструктор? - PullRequest
21 голосов
/ 06 сентября 2010

Может ли класс иметь виртуальный конструктор ??

Если да, то почему это требуется?

Ответы [ 7 ]

23 голосов
/ 06 сентября 2010

нет, класс не может иметь виртуального конструктора.

Нет смысла иметь виртуальный конструктор.Порядок, в котором объекты создаются в C #, заключается в том, что сначала создаются производные классы, поэтому производный конструктор всегда вызывается, поскольку класс, который вы хотите вызвать, хорошо известен во время создания.

Другое дело,если вы действительно наберете этот код, вы быстро увидите, что он вообще не имеет смысла

Если у вас было:

public class BaseClass 
{
    public virtual BaseClass()
    {
    }
}

, а затем

public class InheritedClass : BaseClass
{
    //overrides baseclass constructor but why would you do this given that the     
    //constructor is always going to be called anyway??
    public override InheritedClass()
    {
    }
}
12 голосов
/ 06 сентября 2010

Виртуальный метод по определению - это метод, который отправляется на основе анализа типа времени выполнения получателя, а не анализа статического типа времени получения во время компиляции .

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

Поскольку тип времени выполнения вновь созданного объекта всегда совпадает (*) с типом времени компиляции, виртуальные конструкторы не нужны: диспетчер времени выполнения всегда выбирает тот же метод статическая диспетчеризация, так зачем же что-то менять?

(*) Это не совсем верно; Существуют сценарии, включающие COM-взаимодействие, в которых тип выполнения конструкции не является типом времени компиляции. В мире устаревшего кода взаимодействия много странного.

5 голосов
/ 06 сентября 2010

Не напрямую, но классический фабричный метод шаблонов Gang of Four достигает того, что можно сравнить с своего рода виртуальным конструктором, откладывая создание экземпляров для подклассов.

2 голосов
/ 06 сентября 2010

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

Что-то, что можно описать как поведение, подобное виртуальному конструктору, - это когда вы используете фабричный шаблон. Представьте себе этот сценарий:

class AnimalFactory
{
    virtual Animal CreateAnimal( return new Animal("Cow"); );
}

Стандартное поведение этой фабрики - создание коров. Но если мы создадим производный класс:

class DogFactory : AnimnalFactory
{
    override Animal CreateAnimal( return new Animal("Dog"); );
}

Мы сейчас создаем собак. Конечно, это не настоящий виртуальный конструктор (что невозможно), это виртуальная конструкция.

1 голос
/ 06 сентября 2010

Просто к сведению, когда люди запрашивают виртуальные конструкторы, очень хороший шаблон для просмотра: InversionOfControl

В .NET у нас есть несколько IoC-контейнеров, таких как ObjectBuilder, Unity, MEFSpring.NET.В Java (с риском показать мою некомпетентность в Java) есть Spring, Tapestry и многие другие.

IMHO IoC - это то, что заставляет OO выполнять свои обещания.

1 голос
/ 06 сентября 2010

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

0 голосов
/ 06 сентября 2010

Объявление чего-либо виртуального означает, что оно может быть переопределено подклассом текущего класса. Однако конструктор вызывается, когда создается экземпляр класса. В то время вы не можете создавать подкласс рассматриваемого класса, поэтому никогда не будет необходимости объявлять конструктор виртуальным.

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