如何用相同的方法和继承编写2个类?

Kov*_*ovu 2 c# polymorphism inheritance encapsulation abstraction

我有X类,它们具有不同的信息和计算方法,应该共享但可以覆盖,所以:

class Rule1 {
    int type = 1;
    string name = "Rule";
    public float Calc()
    {
        return 1 + 2 + type; // SAME
    }
}

class Rule2 {
    int type = 2;
    string name = "Rule2";
    public float Calc()
    {
        return 1 + 2 + type; // SAME
    }
}

class Rule3 {
    int type = 3;
    string name = "Rule3";
    public float Calc()
    {
        return 3 + 4 + type; // DIFFERENT
    }
}
Run Code Online (Sandbox Code Playgroud)

我要在调用方法中编写的内容如下:

class Calculator
{
    public void Do(List<IRules> ruleList)
    {
        foreach(var rule in ruleList)
        {
            rule.Calc();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么我的界面应该如何看起来又如何将calc方法抽象为默认实现但可以覆盖呢?

Cod*_*ter 5

如果您有这对大多数继承正确的,但实现不是全部,标记它virtualoverride它的派生类:

public class BaseCalculation
{
    public virtual float Calculate()
    {
        return 42;
    }
}

public class HalfCalculation : BaseCalculation
{
    public override float Calculate()
    {
        return 21;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用基类BaseCalculation,而不是接口。如果坚持使用接口,那么仍然可以Calculate()在接口中定义方法并将其应用于基类:

public interface IRules
{
    float Calculate();
}

public class BaseCalculation : IRules
{
    // same as above
Run Code Online (Sandbox Code Playgroud)

有了额外的好处,您可以将此接口应用于也计算某些内容的其他类,但其中没有任何逻辑BaseCalculation