覆盖基类中的函数

时间:2015-04-14 14:52:23

标签: c# oop inheritance override

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

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 Calc得到25

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

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

3 个答案:

答案 0 :(得分:7)

如果是override

,您可以使用virtual方法
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关键字的

方法只隐藏基类的方法

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

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

SO: new vs override difference

答案 1 :(得分:3)

如果要提供派生类型可以覆盖的默认实现,请将基类中的方法标记为virtual;如果要将实现保留为派生类型,则将其标记为abstract。 / p>

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

答案 2 :(得分:0)

如果您的场景与此处描述的一样简单,请使用子类中的覆盖方法来获取虚方法。如果您的计算更复杂,您应该查看策略模式: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();
    }
}