基数 class 中的覆盖函数

Override function in base class

在下面的示例中,我想替换部分计算,而不必在派生子 类 中重新实现整个计算。

class DummyCalcBase
{
    public int changeable_part()
    {
        return 5;
    }

    public int common_calculation()
    {
        return 5 * changeable_part();
    }
}

class DummyCalc : DummyCalcBase
{
    public new int changeable_part()
    {
        return 10;
    }
}

class Program
{
    static void Main(string[] args)
    {
        int c = new DummyCalcBase().common_calculation();
        Console.WriteLine("Base gives " + c.ToString());

        int c2 = new DummyCalc().common_calculation();
        Console.WriteLine("Calc gives " + c2.ToString());
    }
}

然后给出输出: 基地给25 计算得出 25

我想要的是让 DummyCalc().common_calculation() 调用新的 changeable_part(并给出答案 50)。

这意味着我不必将相同的方法复制并粘贴到子 类。

如果是 virtual

,你可以 override 方法
class DummyCalcBase
{
    public virtual int changeable_part()
    {
        return 5;
    }

    public int common_calculation()
    {
        return 5 * changeable_part();
    }
}

class DummyCalc : DummyCalcBase
{
    public override int changeable_part()
    {
        return 10;
    }
}

带有new关键字的方法只隐藏基础class

的方法

如果方法是虚拟的,下面的代码将计算 50:

DummyCalcBase dummy = new DummyCalc();
int calc = dummy.common_calculation();

SO: new vs override difference

如果您想将实现留给派生类型,请将基础 class 中的方法标记为 virtual if you want to provide a default implementation that derived types can override, or abstract

然后只需override派生类型中的那些方法,并根据需要提供功能。

如果您的场景像您在此处描述的那样简单,请使用虚方法,在子class 中使用覆盖方法。如果你的计算比较复杂,你应该看看策略模式:http://en.wikipedia.org/wiki/Strategy_pattern

您的代码将如下所示:

public interface IStrategy
{
    int getValue();
}

public class Context
{
    private readonly IStrategy strategy;

    public Context(IStrategy strategy)
    {
       this.strategy = strategy;
    }

    public int common_calculation()
    {
        return 5 * strategy.getValue();
    }
}

public class FiveStrategy : IStrategy
{
     public int getValue()
     {
         return 5;
     }
}

public class TenStrategy : IStrategy
{
    public int getValue()
    {
        return 10;
    }
}

internal class Program
{
    public static void Main(string[] args)
    {
        var context5 = new Context(new FiveStrategy());
        Console.WriteLine(context5.common_calculation());

        var context10 = new Context(new TenStrategy());
        Console.WriteLine(context10.common_calculation());

        Console.ReadLine();
    }
}