无法强制将抽象 class 的基本构造函数用于派生 class
Can't enforce the use of base constructor of an abstract class into derived class
我试图按照下面的答案在我的派生 类 中强制使用特定的参数化构造函数:
使用上述答案中提供的示例,代码编译如预期的那样失败。即使在修改代码以使其类似于我的代码之后,它仍然失败。我的实际代码虽然编译得很好。我不知道为什么会这样。
这是根据提供的答案修改后的示例(不会按预期编译):
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/解决方案:
根据下面的 指出使用关键字 'params' 的含义这里是我的代码的更正段落,它使它按预期运行(编译失败):
public abstract class ParameterizedMethod : IParameterizedMethod
{
public ParameterizedMethod(Parameter[] parameters) // **'params' removed**
{
SetParameters(parameters);
}
// original implementation above
}
以下构造函数尝试不带任何参数调用基础 class' 构造函数。
public AddPackageMethod(IList<Url> links)
{
}
好吧,碰巧你的基础 class' 构造函数 可以 在没有任何参数的情况下被调用,因为params
关键字。所以它编译得很好。
public ParameterizedMethod(params Parameter[] parameters)
{
SetParameters(parameters);
}
只是为了测试,如果您删除 params
关键字,从而强制传递一个参数,您的代码将无法编译,正如您所期望的那样。
我试图按照下面的答案在我的派生 类 中强制使用特定的参数化构造函数:
使用上述答案中提供的示例,代码编译如预期的那样失败。即使在修改代码以使其类似于我的代码之后,它仍然失败。我的实际代码虽然编译得很好。我不知道为什么会这样。
这是根据提供的答案修改后的示例(不会按预期编译):
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/解决方案:
根据下面的
public abstract class ParameterizedMethod : IParameterizedMethod
{
public ParameterizedMethod(Parameter[] parameters) // **'params' removed**
{
SetParameters(parameters);
}
// original implementation above
}
以下构造函数尝试不带任何参数调用基础 class' 构造函数。
public AddPackageMethod(IList<Url> links)
{
}
好吧,碰巧你的基础 class' 构造函数 可以 在没有任何参数的情况下被调用,因为params
关键字。所以它编译得很好。
public ParameterizedMethod(params Parameter[] parameters)
{
SetParameters(parameters);
}
只是为了测试,如果您删除 params
关键字,从而强制传递一个参数,您的代码将无法编译,正如您所期望的那样。