在下面的示例中,我想替换部分计算,而不必在派生子类中重新实现整个计算。
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)。
这意味着我不必将相同的方法复制并粘贴到子类中。
答案 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();
答案 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();
}
}