我需要给用户某种程度的功能控制权。因此,我想部分实现用户可以完全实现的类。我想出了这个解决方案。

public abstract class A
{
    protected void FunctionA()
    {
        // My implementation here
        FunctionB();
    }

    protected abstract void FunctionB();
}

public class B : A
{
    protected override void FunctionB()
    {
        // User implementation here
    }
}


另一个解决方案是这个

public class A
{
    protected virtual void FunctionB()
    {
        // My implementation here
    }
}

public class B : A
{
    protected override void FunctionB()
    {
        base.FunctionB();
        // User implementation here
    }
}


我是否有理由应该使用其中一种解决方案?它提供某种优势吗?有人能给我一些我何时应该使用一种解决方案而不是另一种解决方案的见解吗?

最佳答案

您的第一个解决方案实际上是一个众所周知的模式,称为Template Method pattern。如果要确保已执行基本方法,这是一种好方法(因为FunctionA除了调用FunctionB可能还会做其他事情)。

在第二种解决方案中,重写方法可能不调用基本方法。根据您的情况,是否合适。

09-05 01:28