在包含抽象方法的抽象 class 中重构具体方法

Refactoring a concrete method in abstract class which contains an abstract method

考虑以下代码,

abstract class AbstractClass
{
 public abstract void AbstractMethodA();
 public void ConcreteMethodA()
 {
  //Some operation
  ConcreteMethodB();
 }
}

 public void ConcreteMethodB()
 {
  //Huge code unrelated to this class
  AbstractMethodA();
 }
}

class DerivedClass : AbstractClass
{
public void AbstractMethodA()
{
//Some operation
}
}

现在我希望将 ConcreteMethodB() 移动到分离 class 并从方法 ConcreteMethodA() 抽象 class 中调用它。但是由于 ConcreteMethodB() 使用了在 DerivedClass 中实现的抽象方法 AbstractMethodA(),我无法从新的 class?知道如何解决这个问题吗?

你为什么不这样做

static class Helper {
 public static void ConcreteMethodB(AbstractClass caller)
 {
      //Huge code unrelated to this class
      caller.AbstractMethodA();
 }
}

然后在 AbstractClass

abstract class AbstractClass
{
 public abstract void AbstractMethodA();
 public void ConcreteMethodA()
 {
  //Some operation
  Helper.ConcreteMethodB(this);
 }
}

编辑,包括来自 David Arno 的基于接口的解耦建议:

static class Helper {
 public static void ConcreteMethodB(IAbstractClass caller)
 {
      //Huge code unrelated to this class
      caller.AbstractMethodA();
 }
}
interface IAbstractClass {
     void AbstractMethodA();
}

然后在 AbstractClass

abstract class AbstractClass
{
 public abstract void AbstractMethodA();
 public void ConcreteMethodA()
 {
  //Some operation
  Helper.ConcreteMethodB(this);
 }
}

这为您提供了更好的图层隔离。当然,David 在他的 post 中提到的使用 "Action" 和传递方法作为参数的解决方案也值得考虑。

要完全将两者分离,您可以采取 "functional" 路线:

static class Helper 
{
    public static void ConcreteMethodB(Action caller)
    {
        //Huge code unrelated to this class
        caller();
    }
}

将抽象类更改为:

abstract class AbstractClass
{
    public abstract void AbstractMethodA();
    public void ConcreteMethodA()
    {
        Helper.ConcreteMethodB(AbstractMethodA);
    }
}