有点愚蠢的问题,但我想知道将数据从返回到被覆盖的基本方法的可接受方式是在c#中。
e.g。我想我能做到:
class A
{
int x;
public virtual void DoStuff() {
Console.WriteLine(x);
}
}
class B : A
{
public override void DoStuff() {
x = 1;
base.DoStuff();
}
}
但是有没有更好的方法,例如不需要使用成员变量?
答案 0 :(得分: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);
}
}
答案 1 :(得分: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);
}
}
答案 2 :(得分: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; } }
}
答案 3 :(得分: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)。