2012-07-30 3 views
0

두 객체, MasterSlave이 있다고 가정 해 보겠습니다.숨겨진 함수 호출

Init();이라는 방법이 있습니다. Init()에 대한 내용은 사용자의 초기화 코드가 포함되어 있기 때문에 가상화가 필요하지만 SlaveMaster의 목록에 추가되면 자동으로 호출해야합니다. 그러나이 메소드는 사용자가 호출 할 수 없어야하며 자동으로 호출되어야합니다.

내가 먼저 시도한 것은 이벤트입니다. Slave 개체가 OnSlaveInitialized 처리기에서 처리 할 수있는 이벤트를 만듭니다. 많은 Slave 개체가 있기 때문에이 작업을 수행 할 수 없으며 초기화 된 순서에 대한 제어권이 없습니다.

두 번째로 시도한 것은 내부 메서드입니다. Master의 목록에 개체를 추가 할 때 internal Init()을 호출하면 모두 괜찮아 보이는 것처럼 보입니다. 이렇게하면 공용 클래스에서 메서드를 상속받을 수 없습니다.

내가 한 세 번째 작업은 이것입니다. _Init()이라는 내부 메서드를 만들어서 protected virtual Init()을 호출하여 내 문제를 해결했습니다. 나는 여기에서 고통스럽게 확실한 해결책을 잃었 때문에, 난 그냥 바보의 주요 파업을해야합니까, 또는이는 정상적으로 이루어집니다 방법입니다 -


지금은 물어보고 싶은? 적절한 방법은 무엇입니까? 나는 내가 묻고있는 것의 요점을 알기를 바란다. 문제를 설명하기 위해 최선을 다했다. 어떤 도움


이에 대한

덕분에 내가 지금 가지고있는 코드의 요지이다. 마스터 (Master)리스트에 Master.AddSlave()를 통해 슬레이브 객체를 추가 할 때 Init()가 보이지 않게 자동 호출되도록하는 것이 포인트입니다.

public class Master 
{ 
    private List<Slave> _slaves; 

    public void AddSlave(Slave slave) 
    { 
     // Call the "hidden" init 
     slave._Init(); 
     _slaves.Add(slave); 
    } 
} 

public class Slave 
{   
    internal void _Init() 
    { 
     // Call the topmost overloaded method. 
     Init(); 
    } 

    protected virtual void Init() 
    { 

    } 
} 

public class SuperSlave : Slave 
{   
    protected override void Init() 
    { 
     // Now this method gets called automatically 
     // when Master.AddSlave adds this object. 
    } 
} 
+6

시도한 코드의 작은 스 니펫이 설명보다 훨씬 유용합니다. – Marlon

+3

"하지만이 메서드는 사용자가 호출 할 수 없어야합니다."및 "사용자의 초기화 코드가 들어 있기 때문에 가상으로해야합니다."아마도 호환되지 않는 문이므로 사용자에게 제공 할 수있는 방법을 생각할 수 없습니다 그들 자신이 호출 할 수없는 메소드 구현을 가지고있다. –

+0

가상 함수에 코드를 추가했지만 실제로 호출 할 수있는 권한이 없습니다. 슬레이브를 초기화해야 할 때 자동으로 수행됩니다. 이것이 의미하는 바입니다. 질문을 수정하고 곧 코드 스 니펫을 게시하겠습니다. –

답변

1

내가 알 수있는 한,이 작업을 수행하는 기본적인 두 가지 방법이 있습니다. 당신이 이미 시도처럼

  1. , 자동으로 protected 방법이되는 어셈블리의 외부 protected virtual Init()
  2. protected internal virtual Init()를 호출하는 internal InitInternal() 방법.
1

그러나 이것이 원하는 해결책이 될 수는 없지만 이것이 적절한 해결책이 될 수 있다고 생각합니다.

Init 메서드가 여러 번 호출되면 InvalidOperationException을 던집니다.

설명 : 개체의 현재 상태에 대한 메서드 호출이 유효하지 않은 경우에 throw되는 예외입니다.

필자의 의견으로는, 문서가 제대로 작성되고 개체 속성과 메서드 이름이 무엇을하는지, 대부분의 사용자 (개발자) 어떻게 작동하는지 이해하기 위해 코드를 소비합니다.

Init을 호출 한 다음 Master 개체를 추가하려는 사용자는 해당 예외를 throw하여 클래스 사용 방법이 잘못되었음을 알 수 있습니다.

편집 : OnInit 메서드의 이름을 지정하는 것은 좋은 생각 일 수 있습니다. 즉, 클래스 사용자가 직접 호출해서는 안된다는 표시가됩니다.

+0

두 접근법을 모두 결합합니다. 즉, 숨겨진 내부 메소드가 다른 메소드를 호출하고, Init가 다시 호출되고 throw 및 예외가 발생하는 경우를 대비하여. 둘 다 감사합니다. –