2012-05-21 8 views

ответ

1

У вас может быть базовый класс, который делегирует производный класс, как с Template pattern. Это открыто для расширения, позволяя производным классам, но базовый класс по-прежнему будет закрыт для модификации.

Вот пример в 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 (его закрытым для модов) и он делегирует на производные классы, и более производные классы могут быть реализованы (открыты для расширения)

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. Вы можете легко получить кучу налоговых калькуляторов и выбрать один из них на основе страны или чего-либо еще.