2014-02-16 20 views
0

我发现了一堆与此相关的问题,但没有完全回答,尽管我确定它在某处。如何找到没有多个“is”语句的派生类的类型?

我正在寻找简单地找到我正在从基类引用处理哪个派生类。

我的代码块这样

public void AddMenu(iTarget target, Menu callingMenu) 
{ 
    if (target is Corporation) 
     AddMenu(target as Corporation, callingMenu); 
    if (target is Company) 
     AddMenu(target as Company, callingMenu); 
    if (target is Asset) 
     AddMenu(target as Asset, callingMenu); 
    if (target is Operative) 
     AddMenu(target as Operative, callingMenu); 
} 

而且

if (uip.UIPButton is UIPCorporationButton) 
     btn = UIPCorporationButton.Create(contents.gameObject, (uip as Corporation)); 
else if (uip.UIPButton is UIPCompanyButton) 
     btn = UIPCompanyButton.Create(contents.gameObject, (uip as Company)); 
else if (uip.UIPButton is UIPAssetButton) 
     btn = UIPAssetButton.Create(contents.gameObject, (uip as Asset)); 
else if (uip.UIPButton is UIPIndButton) 
//so on and so on 

而且我喜欢用这样的:

public void AddMenu(iTarget target, Menu callingMenu) 
{ 
    AddMenu(BaseClass(target));//or whatever would send iTarget as Corporation, Company, or whatever it's base type is 
} 

或者类似的东西:

public void DoThing(iTarget target) 
{ 
    switch(target.BaseClass)//or whatever 
    { 
     case Corporation: 
      //stuff 
      break; 
     case Company: 
      //other stuff 
      break; 
    } 
} 

有没有一种方法来获取派生类并将其用作上面的参考?

+2

您正在寻找访客模式。 – SLaks

回答

1

带有if/else语句的GetType()将执行您想要的操作。

private abstract class Base1 
    { 

    } 

    private class Extend1 : Base1 
    { 

    } 

     Base1 whatTypeAmI = new Extend1(); 
     var t = whatTypeAmI.GetType(); 

     if (t == typeof(Extend1)) 
      { 
       //do work 
       Console.WriteLine("hello extend1"); 
      } 
     else { 
       Console.WriteLine("I don't know what type I am"); 
      } 
     } 
+0

所以这应该有更好的表现对不断铸造,对吧?因为它只发现一次类型,然后只检查类的类型? – LZG

+0

是的,性能会很好,因为它只执行一次GetType()。 这就是说,你应该看看下面的PMF的回应,看看你是否可以使用ITarget。如果它适用于您的特定场景,这是一个很好的建议。 – jhilden

+0

问题是我需要弄清楚iTarget在* some *点上的含义,因为它决定调用什么菜单以及显示哪些数据。 iTarget与游戏世界中的大多数“事物”具有非常广泛的接口。 – LZG

3

确保你真的需要那个switch语句。我不知道你的AddMenu是如何工作的,但如果它需要ITarget,你为什么需要演员?只需调用它与基类。

通常,如果这种“打开类型”结构看起来是必需的,那么就存在设计缺陷。虚拟方法调用是执行此操作的普通方式,因此请考虑重构代码,以便您可以执行

target.AddMenu(callingMenu); 

改为。

+0

那么目标是一个游戏类,所以它不应该有gui逻辑就像一个方法。这个addmenu正在接受一些目标,并且由于有一行AddMenu(公司公司,菜单调用菜单)等方法,它会调用与该类相关的特定菜单(在本例中,它调用CorpMenu并将该公司发送到该菜单以填充该信息)。所以当iTarget的按钮被点击时,它会调出按钮上的任何iTarget,将它发送给它,计算出它应该调用的菜单,并发送菜单应该显示的类。 – LZG

+0

好的,那么我同意Ui不应该混入逻辑。然后,您可以在游戏类和用户界面之间使用接口或事件,并返回正确的AddMenu方法。 – PMF

+0

+1。 @LZG你不应该**需要关于类型的switch-statement,这就是虚拟方法首先要做的。 –

相关问题