C#에서 친구가없는 이유에 대한 질문이 광범위하게 논의되었습니다.클래스 아키텍처, 친구 허용하지 않음
다음과 같은 디자인 문제가 있습니다.
나는 두 클래스가 있습니다 TradingSystem 및 주문입니다. Trading System 클래스에는 하나의 공용 함수 AddOrder (Order ord) 만 있습니다. 클라이언트는이 기능 만 호출 할 수 있습니다. 다른 모든 논리는 숨겨져 있어야합니다. 클래스는 시장 이벤트를 청취하고 TradingSystem ExecuteOrder의 다른 함수를 호출해야하므로 public으로해야합니다. 그렇게 함으로서 거래 시스템의 고객이이 기능을 호출 할 수 있도록 허용하고 싶지 않습니다.
UPDATE 주문 클래스와 TradingSystem는 별도의 어셈블리에 살고있다. 주문 클래스는 클래스이며 다른 많은 클래스가 파생 될 수 있습니다. 모든 클라이언트가 어셈블리 외부에있는 가정
class TradingSystem
{
// Trading system stores list of orders
List<Order> _orders;
// this function is made public so that Order class can call it when need
// but other class must not call it
public ExecuteOrder(Order ord)
{
// some logic
}
// this function is made public for external clients
public AddOrder(OrderRequest ordreq)
{
// omitted code
// create order and pass it this
order.OnOrderAdded(this);
}
}
class Order
{
// reference to TradingSystem class is stored to call it methods
TradingSystem _ts;
public void OnOrderAdded(TradingSystem ts)
{
_ts = ts;
}
// this function is called on timer
void OnMarketEvent()
{
if(/*some logic*/)
_ts.ExecuteOrder()
}
}
@ 존 :'TradingSystem' 내부에서 클라이언트가 캐스팅하지 못하게하겠다고 선언하지 않겠습니까? – Vlad
@Vlad : TradingSystem으로의 캐스팅을 막을 수는 있지만, 다른 인터페이스로 캐스팅하는 것을 막을 수는 없습니다 (두 개의 인터페이스가 있다고 가정). –