Невозможно принудительно использовать базовый конструктор абстрактного класса в производном классе.

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

Абстрактный класс с конструктором

Используя пример, приведенный в приведенном выше ответе, компиляция кода завершается неудачей, как и ожидалось. Даже после изменения кода, чтобы сделать его похожим на мой, он все равно не работает. Хотя мой фактический код компилируется просто отлично. Я в недоумении, почему это так.

Вот модифицированный пример из предоставленного ответа (который не будет компилироваться должным образом):

public interface IInterface
{
    void doSomething();
}


public interface IIInterface : IInterface
{
    void doSomethingMore();
}


public abstract class BaseClass : IIInterface
{
    public BaseClass(string value)
    {
        doSomethingMore();
    }

    public void doSomethingMore()
    {

    }

    public void doSomething()
    {

    }
}


public sealed class DerivedClass : BaseClass
{
    public DerivedClass(int value)
    {

    }

    public DerivedClass(int value, string value2)
        : this(value)
    {

    }
}

Теперь мой код компилируется без проблем:

public interface IMethod
{
    Url GetMethod { get; }
    void SetMethod(Url method);
}


public interface IParameterizedMethod : IMethod
{
    ReadOnlyCollection<Parameter> Parameters { get; }
    void SetParameters(params Parameter[] parameters);
}


public abstract class ParameterizedMethod : IParameterizedMethod
{

    public ParameterizedMethod(params Parameter[] parameters)
    {
        SetParameters(parameters);
    }


    private Url _method;
    public Url GetMethod
    {
        get
        {
            return _method;
        }
    }

    public void SetMethod(Url method)
    {
        return _method;
    }


    public ReadOnlyCollection<Parameter> Parameters
    {
        get
        {
            return new ReadOnlyCollection<Parameter>(_parameters);
        }
    }

    private IList<Parameter> _parameters;

    public void SetParameters(params Parameter[] parameters)
    {

    }
}


public sealed class AddPackageMethod : ParameterizedMethod
{
    public AddPackageMethod(IList<Url> links)
    {

    }

    public AddPackageMethod(IList<Url> links, string relativeDestinationPath)
        : this(links)
    {

    }

    private void addDownloadPathParameter(string relativeDestinationPath)
    {

    }

    private string generatePackageName(string destination)
    {
        return null;
    }

    private string trimDestination(string destination)
    {
        return null;
    }

}

Я удалил реализацию некоторых методов, чтобы сделать ее максимально лаконичной. В качестве примечания мой реальный код может отсутствовать в некоторых областях. Рассмотрим эти части WIP.

Обновление 1/Решение:

В соответствии с ответом sstan ниже, указывающим на последствия использования ключевого слова "params", здесь исправленный отрывок моего кода, который делает он ведет себя как задумано (сбой при компиляции):

public abstract class ParameterizedMethod : IParameterizedMethod
{
    public ParameterizedMethod(Parameter[] parameters) // **'params' removed**
    {
        SetParameters(parameters);
    }
     // original implementation above      
}

person Sven M.    schedule 28.06.2015    source источник
comment
Какую именно часть вы имеете в виду?   -  person Sven M.    schedule 28.06.2015
comment
Не в теле вопроса, а в тегах! ;)   -  person Adriano Repetti    schedule 28.06.2015
comment
О, ты прав. Должно быть, я случайно щелкнул не тот тег в меню выбора. Спасибо, что указали на это. Я исправил эту ошибку. :)   -  person Sven M.    schedule 28.06.2015


Ответы (1)


Следующий конструктор пытается вызвать конструктор базового класса без каких-либо параметров.

public AddPackageMethod(IList<Url> links)
{

}

Так получилось, что конструктор вашего базового класса может вызываться без каких-либо параметров из-за ключевого слова params. Так что компилируется нормально.

public ParameterizedMethod(params Parameter[] parameters)
{
    SetParameters(parameters);
}

Просто для тестирования: если вы удалите ключевое слово params, тем самым принудительно передав параметр, ваш код не скомпилируется, как вы и ожидали.

person sstan    schedule 28.06.2015
comment
Ты абсолютно прав. Последствия использования «параметров» никогда не приходили мне в голову. Спасибо за быструю доставку этого точного решения. - person Sven M.; 28.06.2015