2011-07-06 5 views
0

나는 이것이 코드 냄새라고 느낀다. 나는 이것을 더 잘할 수있다. 그렇다면이 점을 지적 해주세요.두 클래스가 서로를 참조하는 생성자가 있습니까?

class main 
{ 
    void main() 
    { 
    object A 
    object B 

    A = new SystemA(ref B) 
    B = new SystemB(ref A) 
    } 
} 
class SystemA 
{ 
    SystemB B; 
    public SystemA (ref B) 
    { 
    this.B = B; 
    } 
} 
class SystemB 
{ 
    SystemA A; 
    public SystemA (ref A) 
    { 
    this.A = A; 
    } 
} 

기본적으로 서로 참조하는 두 개의 클래스를 초기화해야합니다.

이 작동하고 나중에 초기화 이후에 액세스 할 때 두 자식 클래스의 클래스 필드에 null 참조 예외를 생성하지 않습니다.

는 내가 아마 초기화 한 후 다음을 설정할 수 있습니다 실현,하지만이 터치 내가 초기화 액션 이러한 과제를 볼 수 있기 때문에, 회피하고자 더 팽창을 추가합니다. 당신이 A를 구성 할 때 그 B의 값이기 때문에 - 당신이 실제로 컴파일 된 코드를 준 경우

+0

엄청나게 복잡합니다. 실제 코드를 게시하십시오. –

+0

이것은 너무 많은 후프 점핑을 필요로 할 때마다 그러한 구조의 생성자를 제거하고자합니다. – KevinDTimm

+0

@Brian - 이것들은 제가 언급하고있는 농구대입니다. 여기에 들어가는 트릭이 있습니다 (그리고 그들은 빨기도합니다). – KevinDTimm

답변

3

, 나는 그냥 null에 대한 참조를 저장 SystemA로 끝날 것이라고 생각한다.

참조를 필요로하는 두 개의 클래스가 분명 코드 냄새가 있지만, 은 둘 중 하나가 다른 하나를 구성하고 "this"를 전달하지 않는 한 서로 참조하도록 만들 수 없습니다. 예

class SystemA 
{ 
    private readonly SystemB systemB; 

    public SystemA() 
    { 
     systemB = new SystemB(this); 
    } 
} 

class SystemB 
{ 
    private readonly SystemA systemA; 

    public SystemB(SystemA systemA) 
    { 
     this.systemA = systemA; 
    } 
} 

이제 생성자에 out 매개 변수를 사용하면 하나 다른, 나에 대한 액세스 권한을 부여 그들 중 하나에 속성을 넣어 수 있습니다 (이 정말 불쾌한), 이후 두 값에 액세스해야하는 경우 :

SystemB b; 
SystemA a = new SystemA(out b); 

것은이 작업을 수행하지 마십시오 :

public SystemA(out systemB) 
{ 
    systemB = new SystemB(this); 
    this.systemB = systemB; 
} 

다음과 같이 호출 그래도.

관련 문제