2014-02-25 38 views
4

我想使用具有類型爲A的參數的函數。我想將它從A派生出來的類B,但C#不想。現在繼承的類作爲參考

class A 
{ 
int m_a; 
} 

class B : A 
{ 
int m_b; 
} 

void ShowandEditData(ref A _myvar) 
{ 
... 
} 

,我願做這樣的事情:

B myB = new B(); 

ShowandEditData(ref myB); 

我試圖像鑄造或使用base屬性很多東西。我想我做錯了。

是否有可能用C#做到這一點?

- 代碼編輯由於僞代碼造成混淆。 (對不起,第一篇文章)

+2

'函數'不是有效的C#關鍵字。 –

+1

這段代碼有各種各樣的錯誤。編譯器錯誤消息告訴你什麼? –

回答

2

您必須使用ref keywork對方法的調用:

ShowData(ref myB); 

其實,在類是參考值,這樣你就不需要使用ref。使用ref只適用於值類型(如intshort,double,decimal,bool, DateTime等等的結構),當您確實想要傳遞參考時。

你的情況,你只可以使用

object ShowData(A _myvar) 
{ 
... 
} 
+0

或者,更好的是,刪除函數聲明中的'ref'。 –

+0

也許OP想改變呼叫者的參考? – StuartLC

+0

對不起,ref已經在我的代碼中。 – Xavier

6

只是從你的方法聲明中刪除ref。像這樣:

void ShowData(A _myvar) 
{ 
... 
} 
+2

這是正確的答案 –

+1

爲什麼ref關鍵字不正確?它不是'Function'(OP)和'void'(答案)之間的替代解決方案嗎? – Flater

+0

@Flater,好吧,沒有。我的答案時的問題在方法調用中沒有'ref',只在聲明中。 「函數」在c#中不是關鍵字是正確的,所以顯然存在幾個問題。 –

2

ref關鍵字doesn't support polymorphicism

如果你可以改變的ShowData簽名,那麼我建議你改變它,像這樣:

public A ShowData(A _myvar) 
    { 
    return new B(); // Or A() or whatever. 
    } 

並調用像這樣:

B myB = new B(); 
myB = ShowData(myB); 

或者,您需要這兩個類提供的ShowData重載:

public void ShowData(ref A _myvar) 
    { 
    _myvar = new B(); 
    } 

    public void ShowData(ref B _myvar) 
    { 
    _myvar = new B(); 
    } 

那麼編譯器可以選擇超載:

 A myA = new A(); 
    B myB = new B(); 
    ShowData(ref myB); 
    ShowData(ref myA); 

順便說一句,ShowData是不是一個好名字。 MutateData聽起來更合適:-)

+0

確實MutateData聽起來更好,我剛剛從我的板上覆制了僞代碼。 – Xavier

+1

事實上,「多態性」就是我想要做的。你的鏈接似乎證實,這將不可能與C#;但這是一個恥辱。我會繼續尋找解決方案。 – Xavier