2010-06-11 23 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)。