2011-11-29 45 views
2
Type typeThing = gumballMachine.GetState().GetType(); 
if (typeThing == typeof(NoQuarterState)) { ... } 


IState state; 
public IState GetState() { 
    return state; 
} 


public class NoQuarterState : IState { ... } 

我使用头部第一设计模式Ch10中的gumballMachine应用程序。 full code here这工作。GetType和typeof

问题:typeThing上面的气味!有没有更好的办法?

+0

我不知道任何其他方式获得的类型实例,除了GetType()。有些检查可以通过'is'和'as'运算符来确定它是否是你想要的类型。 –

回答

4

您可以使用is operator

if(gumballMachine.GetState() is NoQuarterState) 
{ 
    //.. 
} 

这当然会导致true为从NoQuarterState以及虽然继承了所有类型。根据你的例子,这应该不成问题。

问题是为什么你必须首先根据类型区分?通常这是一个标志,更好的设计是有序的,也就是说策略模式或其他多态性的使用可能会有所帮助。

1

如果你可以修改GumballMachine类,你可以使用一个枚举,而不是类型:

public enum StateEnum 
{ 
    NoQuarterState, 
    SomeOtherState 
} 

StateEnum GetState { get; } 

if(gumballMachine.GetState.Equals(StateEnum.NoQuarterState)) { ... } 
+0

我会考虑结合现有的代码和你的枚举技术 - 添加StateEnum类型的属性到IState。 – mjwills

1

您可以尝试

object typeThing = gumballMachine.GetState(); 
    //1st way 
    if (typeThing is NoQuarterState) {...} 
    //Or 2nd way 
    if ((typeThing as NoQuarterState)!=null) {...}