如何在不强制转换的情况下通过基类调用子类方法

本文关键字:基类 调用 类方法 情况下 转换 | 更新日期: 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个选项:

  1. 使基本项成为接口:

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

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

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