2011-11-05 6 views
2

그래서이 시스템을 기본 클래스 DisplayObject으로 설정해야합니다. 그것은 Render 메서드와 그 외의 DisplayObjects 목록을 가지고 있습니다. 또한 다양한 행렬 변환에 대한 데이터가 포함되어 있지만 에는에 실제 도면에 대한 데이터가 포함되어 있지 않습니다. 그렇기 때문에 Render 메소드가 가상입니다.가상 메서드의 모든 재정의 후 코드 실행

다음 두 클래스가 있습니다. ColoredShapeTexturedShape는 각각 DisplayObject 상속 및

base.Render(); 

로 시작하고 도면 부호를 수행하는 새로운 방법으로 Render 메소드를 재정의.

이제 개체의 모든 자식에 대해 Render을 호출하려면 후에 렌더링을 완료해야합니다. 그래서 내 문제가있다. 나는 DisplayObject 클래스의 Render 방법의 말에

foreach (var child in Children) child.Render(); 

을 할 경우는 오버라이드 (override)가되기 전에는 base.Render() 전화의 일부이기 때문에, 실행 될 것입니다 내가 대신 서브 클래스에서이 코드를 삽입하는 경우, DisplayObject만이이 기능을 잃어 버리며 앞으로 상속받을 모든 서브 클래스가 수동으로 기능을 구현하도록합니다. 코드는 그래서 "자기 렌더링"

답변

1

원하는 것은 추상적 인 메소드 패턴입니다. 즉, 렌더링 메소드가 가상 렌더링하거나 가상으로 렌더링하는 다른 메소드 (가상 또는 추상)를 렌더링하지 마십시오. 렌더링은 다음과 같이 보일 것입니다.

1

분할 "아이들을 렌더링"별개 :

public void Render() { 
    OnRender(); 
    foreach(var child in Children) child.Render(); 
} 
protected abstract void OnRender(); 

서브 클래스는 자기를 렌더링 OnRender,하지만 아이들을 제공한다. 이는 Render에 의해 처리됩니다. 경우에 따라 Rendervirtual으로 설정하면 이 다른 하위 동작이 필요한 경우이를 제어 할 수 있습니다.

관련 문제