2012-06-30 2 views
24

Можно ли переопределить конструктор базового класса в производном классе?Можно ли переопределить конструктор в C#?

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

+1

Уважаемая экспертная кодировка исходит из логики, я просто спрашиваю о resion – naval

+4

Другие ответили хорошо. Если вы не знаете синтаксис для конструкторов «chainig», это выглядит так: 'internal MyClass (имя строки): base (null, 0, name) {...}'. В этом примере конструктор вызывает базовый конструктор с тремя параметрами. –

+0

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

ответ

43

Нет, вы не можете переопределить конструкторы. Концепция не имеет смысла в C#, потому что конструкторы просто не вызываются полиморфно. Вы всегда указываете, какой класс вы пытаетесь построить, и аргументы конструктору.

Конструкторы не наследуются вообще, но все конструкторы из производного класса должны быть связаны либо с другим конструктором в том же классе, либо с одним из конструкторов базового класса. Если вы не делаете этого явно, компилятор неявно связывается с конструктором без параметров в базовом классе (и возникает ошибка, если этот конструктор не существует или недоступен).

+4

«Концепция не имеет смысла, на самом деле - конструкторы просто не выходят полиморфно». - В Delphi они есть. Это очень полезная функция, и я нахожу обходные решения, требуемые в C#, либо путем отражения, либо прохождения вокруг экземпляров «Type», проверенных во время выполнения, или путем предоставления отдельных классов фабрик, довольно громоздких в сравнении. –

+3

@ O.R.Mapper: Ну да, я говорил в контексте C#. Какие другие языки не имеют отношения к этому ответу. –

+3

В этом случае я предлагаю, чтобы ответ не утверждал, что «концепция не имеет смысла, на самом деле», поскольку это звучит довольно широко. Что-то вроде «Концепция имела бы большой смысл, но невозможно использовать концепцию в C#, поскольку конструкторы здесь не полиморфны». может быть яснее. –

10

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

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

+0

Приобретено для соответствующего и хорошего объяснения !! – KillABug

6

Нет, вы не можете переопределить конструктор.

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

Допустим, вы пишете метод с тем же именем, что и базовый класс (тот же, что и у базового класса), его просто будет новым методом в производном классе без указанного типа возврата, который синтаксически неверен.

+0

Упрощенный для простого объяснения. !! – KillABug

Смежные вопросы