2012-06-25 9 views
0

세 인터페이스 : IServer, IComponent, IClient. 이들 사이의 연결은 이벤트를 통해 수행됩니다. 나는 그들 각각을 구현하는 Server, Component, Client 클래스를 작성한다.메서드의 두 엔트리 포인트를 구별하십시오

구성 요소 간에는 종속성이있을 수 있습니다. 즉, x.Start()이 호출 될 때 x에 종속 된 구성 요소 y - 모든 자손 Start()이 호출됩니다. 종속성은 AddDependency() 방법으로 생성되며 IComponent입니다. (아래 소스 코드 링크 참조).

클라이언트는 이벤트를 사용하여 구성 요소를 직접보고 서버를 통해 상호 작용할 수 없습니다. 이 작업은 모든 구성 요소와 클라이언트가 서버에 등록 된 후에 수행됩니다.

문제점 : 2 엔트리 포인트 갖는다 Start() 방법 : (자손 개시) Start()Component 이벤트 핸들러 호출 : 1 Start()Server 이벤트 핸들러 (1'st 성분) 2에서 호출한다. 경우 1

: 구성 요소의 상태가 이미 Running 경우 - 2의 IllegalOperationException 을 던져 : 자손이 이미 Running 경우 - 아무것도하지 않습니다.

1과 2를 구별하는 방법은 무엇입니까?

제한 사항 : - 수정중인 인터페이스 - 금지됨 - 다운 캐스팅 - 금지됨.

내가 보는 한 가지 해결책은 static 플래그를 넣는 것으로, 1 번째 구성 요소에 대한 Start()이 호출 된 직후에 내립니다. 그러나 외부 메소드가 인터페이스에 지정된 것보다 많은 것을 볼 수 있도록 플래그가 일부 "외부"메소드 (예 : 서버의 핸들러)에서 다시 초기화되어야하므로이 접근법은 캡슐화를 파괴합니다. 또한 이것은 Start()가 Server에서만 호출된다는 것을 암시 적으로 의미하며 문제는 보장되지 않습니다.

더 이상의 아이디어가 있습니까?

출처 : 사전에 http://rghost.net/38868270

감사합니다.

답변

1

"내가 시작 메소드가있는 인터페이스가 있는데 어떻게하면 다른 것을 추가하지 않고도 이미 시작되었는지 알 수 있습니까?"라는 질문을 볼 수 있습니다.

답변을 드릴 수 없다고 생각합니다. 당신이 할 수있는 일은 그것이 어떻게 호출 되든간에 항상 IllegalOperationException을 던지기입니다. 그런 다음 구성 요소에 IllegalOperationException을 붙잡고 전달하십시오 (아무 것도하지 마십시오). 서버 메소드에서 더 관련성이 높은 위치로 버블 링합니다.

나는 이것이 유일한 옵션이라고 생각할 수 있습니다.

참고 : 신뢰할 수없는 출처 (개인적으로 불쾌감을주지 않음)에서 9 개의 파일이 포함 된 zip 파일을 다운로드하고 싶지 않았기 때문에 코드를 보지 않았습니다.

관련 문제