如何通过基类调用子类方法而不进行强制转换

时间:2016-07-06 00:34:40

标签: c# inheritance interface override

鉴于以下类别:

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,具体取决于实例化哪个子类(即不必重新任何类)?我已经尝试了一些使用接口和覆盖的尝试,但是我很难绕过结果变量“向上”。感谢。

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个选择:

  1. 使BaseItem成为一个接口:

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

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

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