其他分享
首页 > 其他分享> > 不能强制将抽象类的基本构造函数用于派生类

不能强制将抽象类的基本构造函数用于派生类

作者:互联网

我试图按照以下答案在派生类中强制使用特定的参数化构造函数:

Abstract Class with Constructor

使用以上答案中提供的示例,代码编译将按预期失败.即使在修改代码以使其类似于我的代码之后,它仍然失败.我的实际代码虽然可以编译.我在这里茫然是为什么.

这是提供的答案的修改示例(无法按预期编译):

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’s answer,指出了使用关键字“ params”的含义,这是我的代码经过更正的段落,使其按预期运行(编译失败):

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

解决方法:

以下构造函数尝试不带任何参数的情况下调用基类的构造函数.

public AddPackageMethod(IList<Url> links)
{

}

好吧,正是因为params关键字,才可以在没有任何参数的情况下调用基类的构造函数.因此它编译良好.

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

仅出于测试目的,如果删除了params关键字,从而强制传递了一个参数,则您的代码将不会像您期望的那样进行编译.

标签:enforcement,constructor,inheritance,default-constructor,c
来源: https://codeday.me/bug/20191028/1950273.html