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

3 に答える 3

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;
}

sの順序に注意してくださいif。クラスがBasePlusONeを継承する場合Base、順序は上記のようにする必要があります。最初が である場合、それはobject と(前述のように と仮定すると)Baseの両方によって入力されます。BaseBasePlustOnoBasePlusOne : Base

あなたのコードの答え

One one = new One();
Base bp = one.GetBase(2);

if (bp is BasePlusOne)
{
    BasePlusOne b = (BasePlusOne)bp;
    b.Bp1MEthod();
    b.FuncA();
}
于 2012-09-02T18:03:44.510 に答える
0

私が非常に間違っていない限り、あなたは戦略パターンを使いたいように聞こえます...

編集-すべてのコードを読んだわけではありません....インターフェースを使用して、戦略パターンのように共通のものを指定します...

于 2012-09-02T17:59:59.843 に答える
0

Bp1MEthod共通の基本クラス (つまり)に追加する必要がありますBaseBasePlusTwoへのキャストBasePlusOneは (通常) 失敗します。

Baseオブジェクトの祖先で上方向 ( からへ) にキャストするBasePlusOneことは悪い考えであり、設計に欠陥があることを強く示唆しています。他の方向へのキャストは、ポリモヒズムの基本的な考え方です。

于 2012-09-02T18:00:27.787 に答える