这是一个多么棒的网站,多年来我一直潜伏在这里阅读其他问题,但现在我有一个自己的问题。
我的同事写了一门很像下面的课。我一看到它就知道它行不通,但我无法向他解释为什么它行不通。
他在将其声明为 a 时所期望的ControlItem<Button>
是,在使用基调用 Draw() 时会调用 Draw(Button) 方法。相反,我们总是最终抛出异常。
这是协方差问题吗?
public abstract class ControlItem
{
public ControlItem()
{
}
abstract public void Draw();
}
public class ControlItem<T> : ControlItem where T : Control, new()
{
public T MyControl { get; set; }
private ControlItem()
{ }
public ControlItem(T control)
: base()
{
MyControl = control;
}
public override void Draw()
{
Draw(this.MyControl);
}
public void Draw(Control cntrl)
{
throw new NotImplementedException();
}
public void Draw(Button button)
{
//Do some work
}
}