如何在不强制转换的情况下通过基类调用子类方法
本文关键字:基类 调用 类方法 情况下 转换 | 更新日期: 2023-09-27 17:55:19
给定以下类:
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,具体取决于实例化哪个子类(即不必重新转换任何类)?我已经使用接口和覆盖进行了一些尝试,但我很难将结果变量"向上"返回。谢谢。
你必须使用 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();
}
为了通过 BaseItem 引用(即多态性)调用 Calculate(),BaseItem 必须具有 Calculate() 方法。您基本上有3个选项:
-
使基本项成为接口:
interface BaseItem //typically interfaces names are prefixed with I in C# { int Calculate(); }
-
使 BaseItem 成为抽象类(一个不能直接实例化的类,因为它不提供完整的实现):
abstract class BaseItem { public abstract int Calculate(); }
-
将计算添加到基类的默认实现:
class BaseItem { public virtual int Calculate() //Note the virtual keyword here { return 0; } }