我可以在子类实现之前始终调用的基类中使用默认方法吗?

que*_*bob 3 c# oop

C#here - 是否可以使用抽象基类定义具有默认行为的方法,并在子类实现之前调用此默认值?例如:

public abstract class Base
{
    public virtual int GetX(int arg)
    {
        if (arg < 0) return 0;
        // do something here like "child.GetX(arg)"
    }
}

public class MyClass : Base
{
    public override int GetX(int arg)
    {
        return arg * 2;
    }
}

MyClass x = new MyClass();
Console.WriteLine(x.GetX(5));    // prints 10
Console.WriteLine(x.GetX(-3));   // prints 0
Run Code Online (Sandbox Code Playgroud)

基本上我不想在每个子实现中都放置相同的样板...

Pet*_*ert 6

谁可以问这个问题.我过去处理这个问题的方法是创建两个方法,一个是基类中的公共方法,另一个是受保护的抽象方法(也许是虚拟的,没有实现).

public abstract class Base
{
  public int GetX(int arg)
  {
    // do boilerplate

    // call protected implementation
    var retVal = GetXImpl(arg);

    // perhaps to more boilerplate
  }

  protected abstract int GetXImpl(int arg);
}

public class MyClass : Base
{
  protected override int GetXImpl(int arg)
  {
    // do stuff
  }
}
Run Code Online (Sandbox Code Playgroud)