可以';t强制在派生类中使用抽象类的基构造函数

本文关键字:抽象类 构造函数 派生 可以 | 更新日期: 2023-09-27 18:00:13

我正试图在我的派生类中强制使用特定的参数化构造函数,如下所示:

具有构造函数的抽象类

使用上面答案中提供的示例,代码编译将按预期失败。即使在修改了代码以使其类似于我的代码之后,它仍然失败。不过,我的实际代码编译得很好。我不知道为什么会这样。

以下是所提供答案的修改示例(不会按预期编译):

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;
    }
}

我删除了一些方法中的实现,以使其尽可能简洁。顺便说一句,我的实际代码可能在某些方面有所欠缺。考虑那些在制品。

更新1/解决方案:

根据sstan在下面指出的使用关键字"params"的含义的回答,这里是我的代码的正确段落,它使它按预期运行(编译失败):

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

可以';t强制在派生类中使用抽象类的基构造函数

以下构造函数尝试在没有任何参数的情况下调用基类的构造函数。

public AddPackageMethod(IList<Url> links)
{
}

好吧,由于params关键字的原因,基类的构造函数可以在没有任何参数的情况下被调用。所以它编译得很好。

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

只是为了测试,如果删除params关键字,从而强制传递参数,则代码将不会像预期的那样编译。