c# 子构造函数根据值调用父构造函数

问题描述 投票:0回答:1

这是我的问题,我已经解决了,但我认为有更好的方法来做到这一点:

我有以下代码:

public class A
{
    public A(int paramA, int paramB)
    {
       ParamA = paramA;
       ParamB = paramB;
    }

    public int ParamA { get; set; }
    public int ParamB { get; set; }
}

我还有以下代码:

public class B : A
{
    public B(int c, int d, int paramA, int paramB)
    {
        C = c;
        D = d;
        if (C == 0)
        {
            ParamA = paramA - D;
            ParamB = paramB;
        }
        else
        {
            ParamA = paramA;
            ParamB = paramB;
        }
    }

    public int C { get; set; }
    public int D { get; set; }
}

换句话说,分配给 ParamA 的值取决于

C
的值。我知道你可以做类似
public B(int c, int d, int paramA, int paramB) : base(paramA, paramB)
的事情,但这不是我想要的,因为
paramA
将被分配给
ParamA
,无论
C
是什么。代码可以工作,但是还有其他更好的方法吗?

编辑:对评论的回复:

是的,它有一个代码中没有的无参数构造函数。 是的,属性是可变的,这是故意的,有更多的代码。 在这个阶段,我试图实现一个干净的代码,只是在子类中父参数依赖于子参数中的一些特定值。

c# inheritance constructor
1个回答
0
投票

显然我不知道你这样做的确切原因,但我倾向于尝试只有一个带有超额支付逻辑的

Mortgage
类,并且可能使用一个标志来识别是否存在超额支付。

除此之外,您可以执行以下操作:

public class A
{
    public A(int paramA, int paramB)
    {
        ParamA = paramA;
        ParamB = paramB;
    }

    public int ParamA { get; set; }

    public int ParamB { get; set; }
}

public class B : A
{
    public B(int c, int d, int paramA, int paramB) 
        : base(paramA, paramB)
    {
        C = c;
        D = d;
        
        if (C == 0)
        {
            ParamA -= D;
        }
    }

    public int C { get; set; }

    public int D { get; set; }
}

也可以检查是否在

C == 0
调用中
base
,但我不建议这样做(在我看来,一开始可读性较差)。

public class B : A
{
    public B(int c, int d, int paramA, int paramB) 
        : base(c == 0 ? paramA - d : paramA , paramB)
    {
        C = c;
        D = d;
    }

    public int C { get; set; }

    public int D { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.