Зачем повторно объявлять конструкторы в C#?

[Serializable]
public class DccFormatterException : Exception
{
    public DccFormatterException()
    {}

    public DccFormatterException(string message): base(message)
    {}

    public DccFormatterException(string message, Exception inner): base(message, inner)
    {}

    protected DccFormatterException(SerializationInfo info, StreamingContext context): base(info, context)
    {}
}

Я понимаю объявление класса. Но что дает переопределение конструкторов? Они даже имеют те же прицелы, что и оригиналы.


person BWhite    schedule 21.08.2014    source источник
comment
@кенни, я до сих пор не понимаю, что ты имеешь в виду. В то время я думал, что это недостаток опыта с моей стороны. Но все примеры, которые я нахожу, следуют шаблону в моем вопросе, и, похоже, по-другому это не работает. Вы можете уточнить?   -  person BWhite    schedule 05.08.2016
comment
Я, возможно, запутался, я удалю комментарий.   -  person kenny    schedule 05.08.2016


Ответы (1)


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

class A {
    public A () {}
    public A (int x) {}
}
class B : A {
    public B(): base() {} // See <1>
}

var b1 = new B();  // O.K.

var a = new A(42); // O.K.

// Compiler error, as there is no matching constructor in B:
// "'B' does not contain a constructor that takes 1 arguments"
var b2 = new B(42);

Любые конструкторы, которые должны быть представлены через производный тип, должны быть «проксированы»; это не имеет приоритет, и в игре нет полиформизма.


1 C# создает конструктор по умолчанию; объявление для B могло бы быть пустым с теми же результатами, но я решил быть явным, а явное имеет значение, если присутствует какой-либо другой конструктор.

person user2864740    schedule 21.08.2014