abstract class 与 calling base

abstract class vs calling base

我需要给用户一定程度的功能控制权。所以我想部分实现一个用户可以完全实现的class。我想到了这个解决方案。

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 之外可能还会做其他事情)。

在第二种解决方案中,覆盖方法可以不调用基方法。根据您的情况,它可能合适,也可能不合适。