3

假设您从这两个类开始:

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调用 get 时,结果都会在返回之前Baz传入。DoSomethingFirst是的,这是对所有子类的重大更改,但它不需要对Bar.

这是标准的设计模式吗?有没有更好的方法让我想念?还想知道是否有比Internal.

4

2 回答 2

2

如果您Foo按照以下方式稍微更改类,您将获得模板方法模式

public class Foo{   
    public Baz Bar(){
        var value = BarInternal();
        DoSomethingFirst(value);
        return value;
    }

    protected virtual Baz BarInternal(){
        return GetStandardBaz();
    }
}

您也可以使用装饰器模式实现类似的效果。决定将取决于你的课程打算做什么的细节。

于 2013-07-24T21:05:47.043 回答
1

这是一件好事,因为您可以以标准方式过滤输入和输出。您可以进行验证和附加处理。

您还可以验证输入,以便内部/虚拟方法可以依赖某些条件为真。

我通常使用后缀“Core”(GetBarCore)。

于 2013-07-24T20:58:58.230 回答