[英]How to treat an instance variable as an instance of another type in C#
我有一個簡單的繼承MyType2
, MyType2
繼承自MyType1
。
我有一個MyType1
的實例, arg
,作為方法的參數傳入。 如果arg
是MyType2
一個實例,那么我想執行一些邏輯,轉換實例。 我的代碼看起來像下面的代碼。
必須創建一個新的局部變量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;
}
注意“是”和“as”是重復測試; 無論是使用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();
}
沒有; 你需要創建一個單獨的變量。
MyType2 b = arg as MyType2;
if(b != null)
{
//Use b
}
我想說選項1是將所有修改代碼(你的注釋行)作為MyType2的函數,然后對它進行(arg as MyType2).Foo()
。
選項2是在MyType1上實現MyMethod,在MyType2中實現覆蓋,只需調用它而不用擔心。 MyType1實現可能什么都不做,這不是最好的設計。
編輯:技術上不違反LSP,因為這只適用於這種情況的反面(MyType2不應該破壞MyType1的行為)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.