2008-09-19 2 views
2

객체 지향 환경에서 가장 기본적인 작업은 객체에 대한 메소드를 실행하는 것입니다. 이렇게하려면 메서드를 호출하는 개체에 대한 참조가 있어야합니다. 이 참조를 설정하여 호출 객체의 생성자 (또는 초기화 메서드)에 매개 변수로 객체를 전달하는 적절한 방법입니까?개체 간 메시지 전달 - 대상 개체를 참조하는 방법?

객체 barfoo 호출 객체, 그것은 (의사 코드에서) 말을 올바른 경우 : 당신이 앞뒤로 메시지를 전달해야하면 어떻게됩니까

bar = new barClass() 
foo = new fooClass(bar) 

? 대상 개체를 등록하는 방법이 필요합니까?

foo = new fooClass() 
bar = new barClass() 

foo.register(bar) 
bar.register(foo) 

이 문제를 해결하는 패턴이 있습니까?

답변

2

일반적으로 의존성 주입이 필요합니다. 통신하는 두 객체에 대해 이야기하고 있다면 첫 번째 예제에서와 같이 매개 변수의 인스턴스를 매개 변수로 전달하십시오. 생성자를 전달하면 참조가 항상 유효한지 확인할 수 있습니다. 그렇지 않으면 레지스터가 호출되었는지 테스트해야합니다. 또한 레지스터를 두 번 이상 호출해도 부작용이 없도록해야합니다.

다른 개체가 이벤트에 등록하는 제어 개체를 원하면 어떻게 될까요? 그런 다음 Register 메서드 (대리자에 추가 할 수 있음)를 사용하는 것이 적합합니다.

는 개체 유형의 Observer Pattern

0

메시징 수준에 따라 메시징 서비스를 구현할 수 있습니다. 객체는 메시지를 수신하거나 일부 MessageProvider에 MessageListener로 등록합니다.

두 개체가 서로 참조를하면 순환 종속성이 생깁니다. 대부분의 경우 나쁘다고 생각합니다.

+0

감사! 많은 객체가 응답 할 수있는 메시지가 있다면 이는 의미가 있습니다. 저는 두 객체가 상당히 밀접하게 결합되어 서로 이야기하는 일반적인 경우에 더 관심이 있습니다. OOP-101 타입 물건. :) –

3

SpringGuice과 같은 종속성 주입 프레임 워크는 처음 메시지가 필요할 때 메시지 수신자를 해결할 수있는 프록시를 사용하여 Java의 주기적 종속성에 대한 해결책을 제공합니다. 그러나 이것은 일반적으로 적용되는 OO 패턴이 아닙니다.

+0

고마워요! 나는 봄을 보느라 조금 시간을 보냈지 만 그리 많지는 않습니다. 나는 분명히 더 깊은 모습을 보일 것이다. –

0

하나는 다른의 공장 수를 참조하십시오. 푸 새로운 줄을 싸는 경우, 연결이 이미 만들어졌다 : 나는 그것이 매우 정확한 관계는 두 개체 사이에 달려 있다고 생각

foo = new Foo(); 
bar = Foo.Poop(); 

function Foo::Poop() 
{ 
    bar = new Bar(this); 
    myChildren.Add(bar); 
    return bar; 
} 

bar.SayHiToParent(); 
foo.SayHiToChildren();