C# 动态转换类
如图所示,我使用以下代码动态选择C# 动态转换类,c#,C#,如图所示,我使用以下代码动态选择base类。我正在将收到的base类转换为相应的类。如果返回的类是BasePlusOne,则此代码将引发异常。有没有更好的方法来处理这种情况?这种方法还有其他缺点吗 class Base { virtual public void FuncA() { MessageBox.Show("10"); } } public class BasePlusOne: Base
base
类。我正在将收到的base
类转换为相应的类。如果返回的类是BasePlusOne
,则此代码将引发异常。有没有更好的方法来处理这种情况?这种方法还有其他缺点吗
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();
}
}
除非我大错特错,否则听起来你想用
编辑-我还没有阅读所有的代码。。。。我将使用一个接口来指定策略模式中的公共内容…您需要将
Bp1MEthod
添加到公共基类(即base
)。将baseplusWO
转换为BasePlusOne
通常会失败
在对象祖先中向上投射(从
Base
到BasePlusOne
)是一个坏主意,也是有缺陷设计的强烈暗示。朝另一个方向浇铸是多面体的基本思想。您可以使用is
操作符测试对象的类型:
One one = new One();
Base bp =one.GetBase(2);
BasePlusOne b = (BasePlusOne)bp;
b.Bp1MEthod();
b.FuncA();
注意if
s的顺序。如果类BasePlusONe
继承了Base
,则顺序必须类似于obove。如果第一个是Base
,那么它将由Base
对象和BasePlustOno
输入(假设BasePlusOne:Base
,如我们所说)
回答您的代码:
if (obj is BasePlusOne) // this should be first
{
BaseBlusOne b = obj as BaseBluseOne;
}
else if (obj is Base)
{
Base b = obj as Base;
}
为了得到一个好的答案,请提供更多关于你想做什么的上下文。编辑问题。请再检查一下。
One one = new One();
Base bp = one.GetBase(2);
if (bp is BasePlusOne)
{
BasePlusOne b = (BasePlusOne)bp;
b.Bp1MEthod();
b.FuncA();
}