我有一个基类,它有一个方法调用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(...);
答案 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>>