class Base
{
virtual public void FuncA()
{
MessageBox.Show("10");
}
}
public class BasePlusOne: Base
{
public void Bp1MEthod()
{
MessageBox.Show("BasePlusOne");
}
override public void FuncA()
{
MessageBox.Show("overridden by BasePlusTwo");
}
}
public class BasePlusTwo : Base
{
public void Bp1MEthod()
{
MessageBox.Show("BasePlusTwo");
}
override public void FuncA()
{
MessageBox.Show("overridden by BasePlusTwo");
}
}
public class One
{
public Base GetBase(int i )
{
if (i == 1)
{
return new BasePlusOne();
}
else
{
return new BasePlusTwo();
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
One one = new One();
Base bp =one.GetBase(2);
BasePlusOne b = (BasePlusOne)bp;
b.Bp1MEthod();
b.FuncA();
}
}
如我所见,我正在使用以下代码动态选择base
类。我正在将base
课程转发给相应的课程。如果返回的类为BasePlusOne
,则此代码将抛出异常。有没有更好的方法来处理这种情况?这种方法还有其他错误吗?
One one = new One();
Base bp =one.GetBase(2);
BasePlusOne b = (BasePlusOne)bp;
b.Bp1MEthod();
b.FuncA();
答案 0 :(得分:2)
您可以使用is
运算符测试对象的类型:
if (obj is BasePlusOne) // this should be first
{
BaseBlusOne b = obj as BaseBluseOne;
}
else if (obj is Base)
{
Base b = obj as Base;
}
注意if
的顺序。如果类BasePlusONe
继承Base
,则订单必须与obove相同。如果第一个是Base
,那么它将由Base
对象和BasePlustOno
输入(假设BasePlusOne : Base
,正如我们所说的那样。)
回答您的代码:
One one = new One();
Base bp = one.GetBase(2);
if (bp is BasePlusOne)
{
BasePlusOne b = (BasePlusOne)bp;
b.Bp1MEthod();
b.FuncA();
}
答案 1 :(得分:0)
除非我非常错误,否则听起来你想使用strategy pattern...
编辑 - 我还没有阅读所有代码....我会使用一个界面来指定战略模式中的常见内容......
答案 2 :(得分:0)
您需要将Bp1MEthod
添加到公共基类(即Base
)。将BasePlusTwo
投射到BasePlusOne
会(通常)失败。
在对象祖先中向上(从Base
到BasePlusOne
)向前投射是一个坏主意,也是对有缺陷设计的强烈暗示。向另一个方向铸造是多元化的基本思想。