如何在不强制转换的情况下通过 base class 调用 subclass 方法
How to call subclass method via base class without casting
给定以下 classes:
class BaseItem {}
class ItemA : BaseItem {
public int Calculate() {
return 0 + 1;
}
}
class ItemB : BaseItem {
public int Calculate() {
return 1+1;
}
}
...是否可以通过某种方式在外部控制器中执行以下操作 class:
BaseClass a = new ItemA();
int result = a.Calculate();
... 因此结果等于 1 或 2,具体取决于实例化了哪个 subclass(即无需重铸任何 class)?我已经尝试使用接口和覆盖进行了一些尝试,但我很难全神贯注地返回结果变量 "upwards"。谢谢
您必须使用抽象关键字:
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 个选项:
将 BaseItem 设为接口:
interface BaseItem //typically interfaces names are prefixed with I in C#
{
int Calculate();
}
使BaseItem成为一个抽象class(一个class不能直接实例化,因为它没有提供完整的实现):
abstract class BaseItem
{
public abstract int Calculate();
}
将 Calculate 的默认实现添加到 BaseClass:
class BaseItem
{
public virtual int Calculate() //Note the virtual keyword here
{
return 0;
}
}
给定以下 classes:
class BaseItem {}
class ItemA : BaseItem {
public int Calculate() {
return 0 + 1;
}
}
class ItemB : BaseItem {
public int Calculate() {
return 1+1;
}
}
...是否可以通过某种方式在外部控制器中执行以下操作 class:
BaseClass a = new ItemA();
int result = a.Calculate();
... 因此结果等于 1 或 2,具体取决于实例化了哪个 subclass(即无需重铸任何 class)?我已经尝试使用接口和覆盖进行了一些尝试,但我很难全神贯注地返回结果变量 "upwards"。谢谢
您必须使用抽象关键字:
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 个选项:
将 BaseItem 设为接口:
interface BaseItem //typically interfaces names are prefixed with I in C# { int Calculate(); }
使BaseItem成为一个抽象class(一个class不能直接实例化,因为它没有提供完整的实现):
abstract class BaseItem { public abstract int Calculate(); }
将 Calculate 的默认实现添加到 BaseClass:
class BaseItem { public virtual int Calculate() //Note the virtual keyword here { return 0; } }