2012-05-21 3 views

답변

1

Template pattern과 같이 파생 클래스에 위임하는 기본 클래스를 가질 수 있습니다. 이 클래스는 파생 클래스를 허용하여 확장을 위해 열리지 만 기본 클래스는 여전히 수정되지 않도록 닫힙니다. 당신이 그나마

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로를 (그것의 개조 폐쇄)를 수정해야하고 위임 클래스를 파생하고, 더 파생 클래스 (확장자 개방) 구현 될 수있다 : 여기

는 C++의 예제

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에 위임됩니다. 세금 계산기를 쉽게 가지고 국가 또는 다른 것을 기반으로 세금 계산기 중 하나를 선택할 수 있습니다.

관련 문제