2011-11-29 46 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) {...}