Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是一种软件设计模式吗?_C#_Design Patterns - Fatal编程技术网

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();
    }
}