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
之外可能还会做其他事情)。
在第二种解决方案中,覆盖方法可以不调用基方法。根据您的情况,它可能合适,也可能不合适。
我需要给用户一定程度的功能控制权。所以我想部分实现一个用户可以完全实现的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
之外可能还会做其他事情)。
在第二种解决方案中,覆盖方法可以不调用基方法。根据您的情况,它可能合适,也可能不合适。