如何在不强制转换的情况下通过 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 个选项:

  1. 将 BaseItem 设为接口:

    interface BaseItem //typically interfaces names are prefixed with I in C#
    {
        int Calculate();
    }
    
  2. 使BaseItem成为一个抽象class(一个class不能直接实例化,因为它没有提供完整的实现):

    abstract class BaseItem
    {
          public abstract int Calculate();
    }
    
  3. 将 Calculate 的默认实现添加到 BaseClass:

    class BaseItem
    {
        public virtual int Calculate()  //Note the virtual keyword here
        {
            return 0;
        }
    }