动态铸造类

时间:2012-09-02 17:56:03

标签: c#

 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();

3 个答案:

答案 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会(通常)失败。

在对象祖先中向上(从BaseBasePlusOne)向前投射是一个坏主意,也是对有缺陷设计的强烈暗示。向另一个方向铸造是多元化的基本思想。