假设你从这两个类开始:
public class Foo{
public virtual Baz Bar(){
return GetStandardBaz();
}
}
public class Qux: Foo{
public virtual Baz Bar(){
return GetQuxBaz();
}
}
现在假设在Baz
被调用时返回它之前需要对Bar
执行某些操作。我会创建一个virtual protected
方法,并从公共方法中删除virtual
,如下所示:
public class Foo{
public Baz Bar(){
var value = BarInternal();
DoSomethingFirst(value);
return value;
}
protected virtual Baz BarInternal(){
return GetStandardBaz();
}
}
public class Qux: Foo{
protected override Baz BarInternal(){
return GetQuxBaz();
}
}
这可确保无论何时调用Bar
,结果Baz
都会在返回之前传递到DoSomethingFirst
。是的,这是所有子课程的重大变化,但它不需要对Bar
的任何呼叫站点进行任何更新。
这是标准的设计模式吗?有没有更好的方法让我失踪?还想知道是否有比Internal
更好的修复后名称。
答案 0 :(得分:2)
如果您按照以下方式略微更改Foo
课程,则会获得Template Method pattern。
public class Foo{
public Baz Bar(){
var value = BarInternal();
DoSomethingFirst(value);
return value;
}
protected virtual Baz BarInternal(){
return GetStandardBaz();
}
}
您也可以使用Decorator pattern来实现类似的功能。决定将取决于您的课程的目的细节。
答案 1 :(得分:1)
这是一件好事,因为您可以以标准方式过滤输入和输出。您可以进行验证和其他处理。
您还可以验证输入,以便内部/虚拟方法可以依赖某些条件为真。
我通常使用后缀“Core”(GetBarCore
)。