仅允许将特定对象类型传递到基于派生类类型的方法

时间:2014-06-13 20:14:05

标签: c# derived-class

我有一个基类,它有一个方法调用AddFruit,它接受​​Fruit类的类并以一般方式处理它。

    public abstract class Foo
    {
        protected List<ProcessedFruit> processedFruit = new List<ProcessedFruit>();

        public void AddFruit(Fruit o)       
        {
            // Process fruit

            processedFruit.Add(o);
        }

        public void Update()
        {
            // Do base class specific stuff here
            OnUpdate();
        }

        protected abstract void OnUpdate();
    }

    public class AppleBar : Foo
    {
        public AppleBar()
            :base(){}

        protected override void OnUpdate() { }
    }

    public class BananaBar : Foo
    {
        public BananaBar()
            :base(){}

        protected override void OnUpdate() { }
    }

任何派生自Foo的类都以非一般方式更新,并以不同的方式使用ProcessedFruit列表。

在实例化Fruit类之后,可以随时添加和处理

Bar

    public abstract class Fruit
    {

    }

    public class Banana : Fruit
    {

    }

    public class Apple : Fruit
    {

    }

我想知道,是否可以仅根据派生的Fruit类类型添加特定类型的Bar类?

例如:

  • AppleBar只允许添加Apple
  • 类型
  • BananaBar只允许添加Banana
  • 类型

我理解我可以覆盖AddFruit方法但我希望处理保留在基类中,并且希望避免在与{{1}相关联的重写方法中调用base.AddFruit }和BananaBar派生类。

我还希望避免使用AppleBar检查Fruit的类型。

理想情况下,我想要的内容如下:

GetType()

这可能吗?

修改

我在使用泛型时遇到以下问题:

var o = new AppleBar()

// This has to be an Apple and intellisense can recognise this 
o.AddFruit(...);          

1 个答案:

答案 0 :(得分:6)

最简单的方法是在基类上使用泛型类型参数,然后由继承类用特定类型填充:

public abstract class Foo<T> where T : Fruit
{
    protected List<ProcessedFruit> processedFruit = new List<ProcessedFruit>();

    public void AddFruit(T o)       
    {
        // Process fruit

        processedFruit.Add(o);
    }

    public void Update()
    {
        // Do base class specific stuff here
        OnUpdate();
    }

    protected abstract void OnUpdate();
}

public class AppleBar : Foo<Apple>
{
    //...
}

<强>更新

有关您无法将AppleBar添加到List<Foo<Fruit>>

的说明,请参阅this answer