在包含抽象方法的抽象 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);
}
}
考虑以下代码,
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);
}
}