2011-03-25 8 views
1

언어 : C# 항목 : 컨트롤 확장.기본 코드를 호출하지 않고 사용자 정의 컨트롤을 확장하는 방법

필자는 이미지를 표시하기위한 컨트롤 인 필드 F가있는 사용자 정의 컨트롤 B가 있습니다.

두 번째 사용자 정의 컨트롤 인 X가 B를 확장합니다. 기본 F를 사용하지만 자체 구현 (X에 특정한 단추 등을 표시합니다)이 있습니다.

X와 B는 별도의 프로젝트에서 발견되며 B는 추상이 아닙니다. 그것은 구체적인 구현입니다.

문제점 : X가 생성 될 때 첫 번째 B의 contrstructor가 호출되어 F를 초기화합니다. B의 생성자를 호출 한 후 F를 다른 것으로 설정하는 자체 생성자를 실행합니다.


1) F의 두 인스턴스가 존재하지만 X는 새 F를 사용해야하지만 이미지를 표시 할 때는베이스 F를 참조하는 것으로 보입니다.

해결 방법 :
1) X에서, 내가 base.F 처분 할 수 F 교체하기 전에 - B에서 또는
2), I는 클래스 유형을 테스트 할 수 있습니다 : 타입 X는 다음 F의 초기화를 건너 뛸 경우.

이러한 해결 방법 중 하나를 사용할 수 있지만 더 나은 아키텍처가 있음을 알 수 있습니다. 근데 뭐?

public class B 
{ 
    private F f; 

    public F F 
    { 
     get { return f ?? (f = InitializeF()); } 
     set { f = value; } 
    } 

    protected virtual F InitializeF() 
    { 
     return new F(); 
    } 
} 

public class X : B 
{ 
    protected override F InitializeF() 
    { 
     return new SomeOtherF(); 
    } 
} 
+0

X와 B에서 F의 초기화가 다른가요? –

+0

예, 두 초기 화가 base-subclass 관계를 더 악화시키는 것입니다. 나는 코드 중복성이 유지 보수상의 이유로 재사용하는 것보다 낫다고 생각하기 시작했다. 하지만 안톤이 그것을 깨뜨린 것 같아요. 다른 init 문제는 ​​다른 곳에서 얻었지만 철저히 해결해야합니다. – Wak

답변

5

게으른 초기화를 시도? "기본 클래스가 무언가를하지 못하도록하고 싶습니다."라는 말을 발견하면 클래스에서 파생되지 않아야합니다.

+0

나는 간단하고 우아한 해결책이 있어야한다는 것을 알고있었습니다. 안톤 감사합니다! – Wak

1

는 오히려 B에서 X를 유도하는 것보다, 공통 기반에서 모두 B와 X를 도출 할 말이겠습니까 :

+0

우수 제안, 나는 그것을 미래에 기억할 것입니다. 이 특별한 경우에는 문제가되는 하나의 필드 일뿐입니다. 감사! – Wak

관련 문제