Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Если у вас есть:

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Поведение по умолчанию этого factory заключается в создании коров. Но если мы создадим производный класс:

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

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

Ответ 5

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

Ответ 6

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

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

IMHO IoC - это то, что делает OO доставкой на promises.

Ответ 7

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