상속의 도움으로 OCP를 사용하는 샘플이 많이 있습니다. 그러나 OCP를 위임과 함께 사용할 수있는 방법이 혼란 스럽습니다. 누구든지 샘플을 공유 할 수 있습니까?위임과 함께 OCP를 어떻게 사용할 수 있습니까?
0
A
답변
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에 위임됩니다. 세금 계산기를 쉽게 가지고 국가 또는 다른 것을 기반으로 세금 계산기 중 하나를 선택할 수 있습니다.
관련 문제
- 1. 어떻게 NSThread와 NSNotification을 함께 사용할 수 있습니까?
- 2. Catalyst와 함께 Haml을 어떻게 사용할 수 있습니까?
- 3. VBA와 함께 MSHTML을 어떻게 사용할 수 있습니까?
- 4. prototype.js와 함께 (mootools와 함께) FancyUpload를 어떻게 사용할 수 있습니까?
- 5. 클래스와 함께 사용할 수 있습니까?
- 6. 어떻게 사용할 수 있습니까?
- 7. vim을 마우스와 함께 사용할 수 있습니까
- 8. Resque와 함께 Redis를 사용할 수 있습니까?
- 9. Apache DBCP와 함께 Atomikos를 사용할 수 있습니까
- 10. 누가 스핑크스를 사자와 함께 사용할 수 있습니까?
- 11. DirectShow 라이브러리를 Qt와 함께 사용할 수 있습니까?
- 12. Phonegap으로 CakePHP를 함께 사용할 수 있습니까?
- 13. 어떻게 CompiledQuery를 사용할 수 있습니까?
- 14. 컴파일러로 xsltproc와 함께 CMake를 어떻게 사용할 수 있습니까?
- 15. 어떻게 파이썬에서 로깅 모듈을 unittest 모듈과 함께 사용할 수 있습니까?
- 16. 어떻게 wrapper_html과 함께 formtastic을 사용할 수 있습니까? 또는 변경하십시오.
- 17. 장고와 함께 부트 스트랩을 어떻게 사용할 수 있습니까?
- 18. Zend Paginator와 Zend Amazon은 어떻게 함께 사용할 수 있습니까?
- 19. Oracle 프로 시저와 함께 rdlc 리포트를 어떻게 사용할 수 있습니까?
- 20. NMock과 함께 사용할 Oracle.DataAccess.Client.OracleException의 인스턴스를 어떻게 만들 수 있습니까?
- 21. 어떻게 ringojs와 함께 몽구스/익스프레스를 사용할 수 있습니까?
- 22. CRUD 작업과 함께 MVVM을 어떻게 사용할 수 있습니까?
- 23. TurboGears 2와 함께 TurboMail 3을 어떻게 사용할 수 있습니까?
- 24. 어떻게 실제 Application 객체를 Android의 ServiceTestCase와 함께 사용할 수 있습니까?
- 25. 어떻게 asp.net mvc 2와 함께 ninject 2.0을 사용할 수 있습니까?
- 26. 범위와 함께 grouped_select group_method를 어떻게 사용할 수 있습니까?
- 27. 어떻게 외부 온도계를 vb.net과 함께 사용할 수 있습니까
- 28. 스윙 : 어떻게 JTextPanes와 함께 JTree를 노드로 사용할 수 있습니까?
- 29. 핵심 데이터와 함께 NSArray 및 NSArrayController를 어떻게 사용할 수 있습니까?
- 30. 하나의 UIToolbar를 여러 UIViewController와 함께 어떻게 사용할 수 있습니까?