簡體   English   中英

如何在C#中將實例變量視為另一種類型的實例

[英]How to treat an instance variable as an instance of another type in C#

我有一個簡單的繼承MyType2MyType2繼承自MyType1

我有一個MyType1的實例, arg ,作為方法的參數傳入。 如果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;
}

注意“是”和“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM