2012-09-02 101 views
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(); 
+1

为了得到一个很好的回答,请提供围绕你正在尝试做更多的上下文。 –

+0

编辑了这个问题。请重新检查。 – logeeks

回答

0

除非我非常错误的,它听起来就像你要使用的strategy pattern...

编辑 - 我还没有看所有的代码....我会用一个接口来指定常见的东西,如战略模式...

0

您需要将Bp1MEthod添加到共同的基类(即Base)。将(通常)失败铸造BasePlusTwoBasePlusOne

在对象血统中向上铸造(从BaseBasePlusOne)对于有缺陷的设计来说是一个坏主意和强烈暗示。向另一个方向投射是多态主义的基本思想。

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 s量级。如果类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(); 
}