Design patterns 我们如何在授权的情况下使用OCP?

Design patterns 我们如何在授权的情况下使用OCP?,design-patterns,open-closed-principle,Design Patterns,Open Closed Principle,在继承的帮助下使用OCP有很多例子。但我对我们如何将OCP与授权结合使用感到困惑。有人能分享任何样品吗 您可以拥有一个基类,该基类委托给派生类,如。通过允许派生类,这对扩展是开放的,但是基类仍然不允许修改 下面是C++中的一个示例: class BaseClass { public: void doStuff() { doStuff1(); // delegating to derived class // do base class stuff her

在继承的帮助下使用OCP有很多例子。但我对我们如何将OCP与授权结合使用感到困惑。有人能分享任何样品吗

您可以拥有一个基类,该基类委托给派生类,如。通过允许派生类,这对扩展是开放的,但是基类仍然不允许修改

下面是C++中的一个示例:

class BaseClass
{
public:
    void doStuff() {
        doStuff1(); // delegating to derived class

        // do base class stuff here

        doStuff2(); // delegating to derived class

        // do more base class stuff here

        doStuff3(); // delegating to derived class
    }

protected:
    virtual void doStuff1() = 0;
    virtual void doStuff2() = 0;
    virtual void doStuff3() = 0;
};

class DerivedClass1 : public BaseClass
{
protected:
    void doStuff1() { /* your impl here */ }
    void doStuff2() { /* your impl here */ }
    void doStuff3() { /* your impl here */ }
};

// Implement as many other derived classes as you wish
请注意,您不必修改基类(它对mods关闭),它将委托给派生类,并且可以实现更多派生类(对扩展开放)

如果我正确获得“委托”,这可能看起来像这样(C#):

类产品
{
公共十进制价格{get;set;}
}
班级篮
{
IEnumerable_产品;
Func_taxCalculator;
公共篮子(IEnumerable产品、Func taxCalculator)
{
_产品=产品;
_taxCalculator=taxCalculator;
}
公共十进制CalculateBasketValue()
{
十进制和=0;
foreach(产品中的var产品)
{
总和+=产品价格+_taxCalculator(产品);
}
回报金额;
}
}
公共静态void Main()
{
var产品=新[]
{
新产品{Price=100}
};
var twentyPercentTax=新功能(产品=>产品价格*0.2m);
var篮子=新篮子(产品,百分之二十税);
Console.WriteLine(basket.CalculateBasketValue());
}
该类接近于计算篮子的值。然而,计算税收的方法是开放的。计税委托给taxCalculator。你可以很容易地拥有一堆税务计算器,并根据国家或其他任何情况选择其中一个

class Product
{
    public decimal Price {get;set;}
}

class Basket
{
    IEnumerable<Product> _products;
    Func<Product, decimal> _taxCalculator;

    public Basket(IEnumerable<Product> products, Func<Product, decimal> taxCalculator)
    {
        _products = products;
        _taxCalculator = taxCalculator;
    }

    public decimal CalculateBasketValue()
    {
        decimal sum = 0;
        foreach (var product in _products)
        {
            sum += product.Price + _taxCalculator(product);
        }
        return sum;
    }
}

public static void Main()
{
    var products = new []
    {
        new Product { Price = 100 }
    };
    var twentyPercentTax = new Func<Product, decimal>(product => product.Price * 0.2m);
    var basket = new Basket(products, twentyPercentTax);
    Console.WriteLine(basket.CalculateBasketValue());
}