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

问题描述 投票:2回答:4

我有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
    }
}

我想在调用方法中写的是这样的:

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

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

c# inheritance polymorphism encapsulation abstraction
4个回答
5
投票

如果您的实现对大多数继承者都是正确的,但不是对所有继承者都正确,请在派生类中将其标记为virtualoverride

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

public class HalfCalculation : BaseCalculation
{
    public override float Calculate()
    {
        return 21;
    }
}

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

public interface IRules
{
    float Calculate();
}

public class BaseCalculation : IRules
{
    // same as above

具有附加的好处,您可以将此接口应用于也计算某些内容的other

类,但是没有BaseCalculation中的任何逻辑。

2
投票

您可以使用抽象基类和Calc上的多态性进行尝试。


1
投票

您正在搜索继承的类和虚拟方法(允许覆盖):


0
投票

每个类都必须支持该接口。在每个类中实现Calc方法都不重要。它们可以相同或不同。

© www.soinside.com 2019 - 2024. All rights reserved.