基数 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();
}
}
在下面的示例中,我想替换部分计算,而不必在派生子 类 中重新实现整个计算。
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();
}
}