2010-03-18 65 views
2

我有一個簡單的繼承層次結構,MyType2繼承自MyType1如何將實例變量作爲C#中另一種類型的實例對待

我有一個MyType1arg的實例,作爲方法的參數傳入。如果argMyType2的一個實例,那麼我想執行一些邏輯,轉換實例。我的代碼看起來像下面的代碼。

必須創建一個新的局部變量b感覺不雅 - 是否有一種方法可以在沒有附加局部變量的情況下實現相同的行爲?

public MyType1 MyMethod(MyType1 arg) 
{ 
    if(arg is MyType2) 
    { 
     MyType2 b = arg as MyType2; 
     //use b (which modifies "arg" as "b" is a reference to it)... 
    } 

    return arg; 
} 
+2

如果你願意展示不同的執行路徑,你可能會得到重構代碼的幫助,這樣你就不必進行這種類型檢查了,這可能會有更好的解決方案。通常你在這裏做的事情可能被認爲是代碼味道。 – 2010-03-18 17:48:12

+0

我明白這樣的顯式類型檢查可以被認爲是一種氣味 - 我可能會重構。 – Ben 2010-03-18 18:15:35

回答

5

注意, 「是」 和 「如」 被複制試驗; 或者使用is,然後(一旦知道)就投 - 首先使用as並且測試null

重新提出您的問題;如果你只想做一兩件事 - 然後抹上:

if(arg is MyType2) 
{ 
    ((MyType2)arg).SomeSpecialMethod(); 
} 

否則 - 也許是virtual方法(在基型),或者只是重構邏輯伸到另一種方法,讓你擁有:

if(arg is MyType2) 
{ 
    StuffThatTakesType2((MyType2)arg); 
} 

persoanlly,我只是使用額外的變量:

MyType2 whatever = arg as MyType2; 
if(whatever != null) { 
    whatever.Foo = 123; 
    whatever.Bar(); 
} 
1

我想說的選項1是把所有的修改代碼(您的評論行)作爲MyType2的函數,然後對其執行(arg as MyType2).Foo()

選項2是在MyType1上實現MyMethod,並作爲MyType2中的重載,並且只需調用它而不用擔心。 MyType1實現可能什麼也不做,這不是最好的設計。

編輯:從技術上講不是違反LSP,因爲它只適用於這種情況(MyType2不應該破壞MyType1的行爲)。

相關問題