无法强制将抽象类的基础构造函数用于派生类

时间:2015-06-28 05:06:22

标签: c# inheritance constructor default-constructor enforcement

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

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

}

我删除了一些方法中的实现,以尽可能简洁。作为旁注,我的实际代码可能缺乏区域。考虑那些部分WIP。

更新1 /解决方案:

根据下面的sstan's answer指出使用关键字'params'的含义是我的代码的更正通道,使其行为符合预期(编译失败):

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

1 个答案:

答案 0 :(得分:4)

以下构造函数尝试调用基类&#39;没有任何参数的构造函数。

private static int[][] maze = {{2, 2, 2, 2, 1, 2, 2}, {2, 2, 2, 2, 1, 2, 2}, 
        {2, 2, 2, 2, 1, 2, 2}, {2, 1, 1, 1, 1, 2, 2}}; // The maze
private static boolean[][] wasHere = new boolean[7][4];
private static boolean[][] correctPath = new boolean[7][4]; // Solution

for (int row = 0; row < maze.length; row++)
{
    // Sets boolean arrays to false
    for (int col = 0; col < maze[row].length; col++)
    {
        wasHere[row][col] = false;
        correctPath[row][col] = false;
    }
}

好吧,你的基础课就是这样。由于public AddPackageMethod(IList<Url> links) { } 关键字,可以在没有任何参数的情况下调用构造函数 。所以编译得很好。

params

仅用于测试,如果删除public ParameterizedMethod(params Parameter[] parameters) { SetParameters(parameters); } 关键字,从而强制传递参数,则代码将无法编译,就像您期望的那样。