Два вызова конструктора внутри одного конструктора в С#

Я знаю, как вызвать другой конструктор для конструктора того же класса или базового класса, но как я могу сделать и то, и другое одновременно? Вот пример того, чего я хочу достичь, отметив, что в реальном случае мы могли бы захотеть сделать что-то более сложное, чем просто установить свойство:

public class BaseClass
{
    public BaseClass(object param)
    {
        // base constructor
    }
}

public class DerivedClass
{
    DateTime Date { get; private set; }

    public DerivedClass()
    {
        Date = GenerateDate();
    }
    public DerivedClass(object param) : base(param)
    {
        // How do I make it call DerivedClass() ?
    }
}

person DMX David Cardinal    schedule 30.11.2019    source источник
comment
Это похоже на изменение базового конструктора: public DerivedClass() : this(someDefaultForTheParam) или public DerivedClass(object param) : this(). Я не уверен, в каком порядке сочетать вызов базового класса и операцию цепочки, но в конце концов есть только два варианта.   -  person Christopher    schedule 30.11.2019
comment
Почти уверен, что у вас не может быть конструктора без параметров в классе, производном от класса без такового... Вам нужно сделать его BaseClass(object param = null) или что-то в этом роде.   -  person Heretic Monkey    schedule 30.11.2019
comment
Оберните общий язык методом и вызовите метод из обоих конструкторов.   -  person Fabio    schedule 30.11.2019
comment
в реальном случае мы могли бы захотеть сделать что-то более сложное, чем просто установить свойство - это может быть хорошим признаком того, что, возможно, что-то более сложное может быть извлечено в собственный метод/класс   -  person Fabio    schedule 30.11.2019
comment
@HereticMonkey: у вас не может быть конструктора без параметров в классе, производном от класса без такового — не совсем так. Это сложно, потому что обычно параметр базового класса предоставляется клиентским кодом. Но если у производного класса есть разумный способ передать параметр базовому классу, он, безусловно, может объявить конструктор без параметров.   -  person Peter Duniho    schedule 30.11.2019
comment
@ПитерДунихо; Я говорил о коде, показанном в OP, где есть конструктор без параметров без ссылки на конструктор базового класса.   -  person Heretic Monkey    schedule 30.11.2019


Ответы (1)


Этот код на самом деле компилируется в Sharp Lab. Не то чтобы мне пришлось исправлять несколько второстепенных вещей.

using System;

public class BaseClass
{
    public BaseClass(object param)
    {
        // base constructor
    }
}

public class DerivedClass : BaseClass
{
    public DateTime Date { get; private set; }

    public DerivedClass() : this(new object()) { }

    public DerivedClass(object param) : base(param)
    {
        //Do Date = GenerateDate(); here
        //Had to cut your pseudo code, as it broke compilation
    }
}

Вы ошиблись: вам нужно DerivedClass(), чтобы позвонить DerivedClass(object param). При наличии нескольких конструкторов тот, который вы на самом деле кодируете, всегда имеет большинство аргументов. Все остальные конструкторы просто связаны с ним, задавая значение по умолчанию для каждого шага.

person Christopher    schedule 30.11.2019
comment
Хотя это не решило мою проблему, я понял, что задаю не тот вопрос. В случае, который я представил, это решает проблему, за исключением того, что я бы использовал null вместо new object(). Пометка как принятый ответ. - person DMX David Cardinal; 02.12.2019
comment
@DCD Мне пришлось угадать значение по умолчанию, и я разрывался между любым экземпляром или нулем. Но, в конце концов, по умолчанию может быть все, что вы хотите. - person Christopher; 02.12.2019