C# 这是一种软件设计模式吗?
假设您从这两个类开始:C# 这是一种软件设计模式吗?,c#,design-patterns,C#,Design Patterns,假设您从这两个类开始: public class Foo{ public virtual Baz Bar(){ return GetStandardBaz(); } } public class Qux: Foo{ public virtual Baz Bar(){ return GetQuxBaz(); } } 现在让我们假设在调用Bar时返回它之前,出现了一个使用Baz的需求。我将创建一个virtualprotecte
public class Foo{
public virtual Baz Bar(){
return GetStandardBaz();
}
}
public class Qux: Foo{
public virtual Baz Bar(){
return GetQuxBaz();
}
}
现在让我们假设在调用Bar
时返回它之前,出现了一个使用Baz
的需求。我将创建一个virtualprotected
方法,并从public方法中删除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
get,结果Baz
在返回之前都会被传递到DoSomethingFirst
。是的,这对所有子类来说都是一个突破性的改变,但它不需要对Bar
的任何调用站点进行任何更新
这是标准的设计模式吗?有没有更好的方法让我错过?还想知道是否有比
Internal
更好的后期修复名称这是一件好事,因为您可以用标准方式过滤输入和输出。您可以进行验证和附加处理
您还可以验证输入,以便内部/虚拟方法可以依赖于某些条件为真
我通常使用后缀“Core”(
GetBarCore
)。如果您稍微更改Foo
类,如下所示,您将得到
你也可以用它来实现类似的目标。决定将取决于您的类打算做什么的详细信息。是否有理由不向基类添加方法Baz2(或NewBaz,或其他什么)?这样你就避免了零钱。对于命名约定,“内部”并不可怕。“Impl”也很常见。你是说
quox
中的override
?回答我自己的问题——不影响调用Baz()的位置的要求是无效的。派生类中调用Baz()的方法必须更改,并且根据具体情况(例如,其他人使用您的库),您可能无法访问该代码。使用新行为添加新方法是更好的做法。我认为Microsoft使用Core
作为后缀(例如)。但是要使用这个模式,您应该从它开始代码>?否则,你的BarInternal
方法就没有意义了。阅读维基百科页面后,我不得不同意这通常是一个模板模式的示例,但我认为在基类中公开一个公共方法并拥有一个虚拟核心方法的过程将是一个更具体的过程
public class Foo{
public Baz Bar(){
var value = BarInternal();
DoSomethingFirst(value);
return value;
}
protected virtual Baz BarInternal(){
return GetStandardBaz();
}
}