언어 : 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();
}
}
X와 B에서 F의 초기화가 다른가요? –
예, 두 초기 화가 base-subclass 관계를 더 악화시키는 것입니다. 나는 코드 중복성이 유지 보수상의 이유로 재사용하는 것보다 낫다고 생각하기 시작했다. 하지만 안톤이 그것을 깨뜨린 것 같아요. 다른 init 문제는 다른 곳에서 얻었지만 철저히 해결해야합니다. – Wak