有很多在继承的帮助下使用 OCP 的示例。但我很困惑我们如何将 OCP 与委派一起使用。任何人都可以分享任何样品吗?
2 回答
            1        
        
		
您可以像模板模式一样拥有一个委托给派生类的基类。这是通过允许派生类开放扩展,但基类仍将关闭修改。
这是 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
请注意,您不必修改 BaseClass(它对 mods 关闭)并将其委托给派生类,并且可以实现更多派生类(对扩展开放)
于 2012-05-21T09:13:17.477   回答
    
    
            0        
        
		
如果我正确获得“委托”,这可能看起来像这样(C#):
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());
}
该类已关闭计算篮子的价值。但是,它对计算税收的方式是开放的。计算税收委托给 taxCalculator。您可以轻松拥有一堆税收计算器,并根据国家或其他任何内容选择其中一个。
于 2012-05-21T21:51:20.830   回答