鉴于以下类别:
class BaseItem {}
class ItemA : BaseItem {
public int Calculate() {
return 0 + 1;
}
}
class ItemB : BaseItem {
public int Calculate() {
return 1+1;
}
}
...以某种方式可以在外部控制器类中执行以下操作:
BaseClass a = new ItemA();
int result = a.Calculate();
...所以结果等于1或2,具体取决于实例化哪个子类(即不必重新任何类)?我已经尝试了一些使用接口和覆盖的尝试,但是我很难绕过结果变量“向上”。感谢。
答案 0 :(得分:3)
您必须使用abstract关键字:
abstract class BaseItem
{
public abstract int Calculate();
}
class ItemA : BaseItem
{
public override int Calculate()
{
return 0 + 1;
}
}
class ItemB : BaseItem
{
public override int Calculate()
{
return 1 + 1;
}
}
void Main()
{
BaseItem a = new ItemA();
int result = a.Calculate();
}
答案 1 :(得分:3)
为了通过BaseItem引用(即多态)调用Calculate(),BaseItem必须具有Calculate()方法。你基本上有3个选择:
使BaseItem成为一个接口:
interface BaseItem //typically interfaces names are prefixed with I in C#
{
int Calculate();
}
使BaseItem成为一个抽象类(无法直接实例化的类,因为它不提供完整的实现):
abstract class BaseItem
{
public abstract int Calculate();
}
为Calculate添加默认实现到BaseClass:
class BaseItem
{
public virtual int Calculate() //Note the virtual keyword here
{
return 0;
}
}