Можно ли переопределить конструктор базового класса в производном классе?Можно ли переопределить конструктор в C#?
Если да, то как это можно сделать и в каком случае это будет практичным? Если нет, почему бы и нет?
Можно ли переопределить конструктор базового класса в производном классе?Можно ли переопределить конструктор в C#?
Если да, то как это можно сделать и в каком случае это будет практичным? Если нет, почему бы и нет?
Нет, вы не можете переопределить конструкторы. Концепция не имеет смысла в C#, потому что конструкторы просто не вызываются полиморфно. Вы всегда указываете, какой класс вы пытаетесь построить, и аргументы конструктору.
Конструкторы не наследуются вообще, но все конструкторы из производного класса должны быть связаны либо с другим конструктором в том же классе, либо с одним из конструкторов базового класса. Если вы не делаете этого явно, компилятор неявно связывается с конструктором без параметров в базовом классе (и возникает ошибка, если этот конструктор не существует или недоступен).
«Концепция не имеет смысла, на самом деле - конструкторы просто не выходят полиморфно». - В Delphi они есть. Это очень полезная функция, и я нахожу обходные решения, требуемые в C#, либо путем отражения, либо прохождения вокруг экземпляров «Type», проверенных во время выполнения, или путем предоставления отдельных классов фабрик, довольно громоздких в сравнении. –
@ O.R.Mapper: Ну да, я говорил в контексте C#. Какие другие языки не имеют отношения к этому ответу. –
В этом случае я предлагаю, чтобы ответ не утверждал, что «концепция не имеет смысла, на самом деле», поскольку это звучит довольно широко. Что-то вроде «Концепция имела бы большой смысл, но невозможно использовать концепцию в C#, поскольку конструкторы здесь не полиморфны». может быть яснее. –
Нет, конструкторы не наследуются. Вы не можете переопределить их в производном классе.
Причина
Базовый конструктор всегда будет вызываться для каждого класса, который происходит от объекта, потому что каждый класс должен иметь по крайней мере один конструктор, который вызывает базовый() конструктор (явно или неявно), и каждый вызов этого конструктора() должен в конечном счете вызвать конструктор base().
Приобретено для соответствующего и хорошего объяснения !! – KillABug
Нет, вы не можете переопределить конструктор.
Если вы посмотрите на основной синтаксис конструктора, он должен иметь то же имя, что и класс, для которого вы его пишете.
Допустим, вы пишете метод с тем же именем, что и базовый класс (тот же, что и у базового класса), его просто будет новым методом в производном классе без указанного типа возврата, который синтаксически неверен.
Упрощенный для простого объяснения. !! – KillABug
Уважаемая экспертная кодировка исходит из логики, я просто спрашиваю о resion – naval
Другие ответили хорошо. Если вы не знаете синтаксис для конструкторов «chainig», это выглядит так: 'internal MyClass (имя строки): base (null, 0, name) {...}'. В этом примере конструктор вызывает базовый конструктор с тремя параметрами. –
Повторно открыть избирателей: пожалуйста, отредактируйте вопрос до обычных стандартов, прежде чем голосовать заново. –