Невозможно принудительно использовать базовый конструктор абстрактного класса в производном классе.
Я пытаюсь навязать использование определенного параметризованного конструктора в моих производных классах в соответствии с приведенным ниже ответом:
Абстрактный класс с конструктором
Используя пример, приведенный в ответе выше, компиляция кода завершается неудачно, как и ожидалось. Даже после изменения кода, чтобы он напоминал мой, он все равно не работает. Мой настоящий код, хотя компилируется просто отлично. Я в недоумении, почему это так.
Вот модифицированный пример из предоставленного ответа (который не будет компилироваться, как ожидалось):
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
}
1 ответ
Следующий конструктор пытается вызвать конструктор базового класса без каких-либо параметров.
public AddPackageMethod(IList<Url> links)
{
}
Ну, просто так получилось, что конструктор вашего базового класса может быть вызван без каких-либо параметров из-за params
ключевое слово. Так что компилируется нормально.
public ParameterizedMethod(params Parameter[] parameters)
{
SetParameters(parameters);
}
Просто для тестирования, если вы удалите params
ключевое слово, таким образом, заставляя параметр передаваться, ваш код не будет компилироваться, как вы ожидали.