2010-06-11 27 views
2

一個愚蠢的問題的位,但我想知道什麼是可接受的方式傳遞數據從返回重寫的基本方法是在C#中。在C#中傳遞重寫的基本方法的數據#

例如我想我可以這樣做:

class A 
{ 
    int x; 
    public virtual void DoStuff() { 
     Console.WriteLine(x); 
    } 
} 

class B : A 
{ 
    public override void DoStuff() { 
     x = 1; 
     base.DoStuff(); 
    } 
} 

但是否有例如不需要使用一個成員變量的一個更好的辦法?

+3

我敢肯定,我不明白這個問題,但你有沒有考慮在基類中添加一個方法來代替參數呢? – 2010-06-11 10:43:36

+0

謝謝你的答案 - 所有有趣的:) – UpTheCreek 2010-06-11 10:52:11

回答

8

的一個解決方案可包括使用具有一個參數從基類重用代碼的受保護方法進行說明。

class A 
{ 
    public virtual void DoStuff() { 
     DoStuffInternal(0); 
    } 
    protected void DoStuffInternal(int x) { 
     Console.WriteLine(x); 
    } 
} 

class B : A 
{ 
    public override void DoStuff() { 
     DoStuffInternal(1); 
    } 
} 
+0

這看起來很有希望...... – UpTheCreek 2010-06-11 10:52:31

2

爲什麼不使用參數?

class A 
{ 
    public virtual void DoStuff(int x) { 
     Console.WriteLine(x); 
    } 
} 

class B : A 
{ 
    public override void DoStuff(int x) { 
     //do stuff 
     int y = 1 
     base.DoStuff(y); 
    } 
} 
+0

我不想將(int x)公開給B的消費者 – UpTheCreek 2010-06-11 10:47:47

2

如何

abstract class A 
{ 
    protected abstract int X { get; } 
    public void DoStuff() { 
     Console.WriteLine(X); 
    } 
} 

class B : A 
{ 
    protected override int X { get { return 1; } } 
} 
0

您可以使用類似Template Method設計模式:

class A 
{ 

    public void DoStuff() { 
     var x = DoGetX(); 
     Console.WriteLine(x); 
    } 

    protected abstract int DoGetX(); 
} 

class B : A 
{ 
    protected override int DoGetX() { 
     return 1; 
    } 
} 

對於幾乎每個開發人員財產是看起來像周圍的場簡單的包裝,我們知道有沒有像虛擬領域那樣的東西。所以我認爲在這種情況下抽象方法是更可取的解決方案(我們已經討論了屬性和方法之間的區別here)。