Вопрос

Есть много образцов использования 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
.

Обратите внимание, что вам не нужно изменить базовый класс (его закрытый для модов), и он делегаты на полученные классы, и могут быть реализованы более полученные классы (открыты для расширения)

Другие советы

Если я получаю «делегацию» правильно, это может выглядеть так (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());
}
.

Класс закрыт для вычисления значения корзины.Однако он открыт для расчета налога.Расчет налога делегируется на налоговой гамма.Вы можете легко иметь кучу налоговых калькуляторов и выбрать один из них на основе страны или что-то еще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top