在C#中将数据传递给重写的基本方法

时间:2010-06-11 10:40:53

标签: c#

有点愚蠢的问题,但我想知道将数据从返回到被覆盖的基本方法的可接受方式是在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();
    }
}

但是有没有更好的方法,例如不需要使用成员变量?

4 个答案:

答案 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)。