두 객체, Master
및 Slave
이 있다고 가정 해 보겠습니다.숨겨진 함수 호출
은 Init();
이라는 방법이 있습니다. Init()
에 대한 내용은 사용자의 초기화 코드가 포함되어 있기 때문에 가상화가 필요하지만 Slave
이 Master
의 목록에 추가되면 자동으로 호출해야합니다. 그러나이 메소드는 사용자가 호출 할 수 없어야하며 자동으로 호출되어야합니다.
내가 먼저 시도한 것은 이벤트입니다. 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.
}
}
시도한 코드의 작은 스 니펫이 설명보다 훨씬 유용합니다. – Marlon
"하지만이 메서드는 사용자가 호출 할 수 없어야합니다."및 "사용자의 초기화 코드가 들어 있기 때문에 가상으로해야합니다."아마도 호환되지 않는 문이므로 사용자에게 제공 할 수있는 방법을 생각할 수 없습니다 그들 자신이 호출 할 수없는 메소드 구현을 가지고있다. –
가상 함수에 코드를 추가했지만 실제로 호출 할 수있는 권한이 없습니다. 슬레이브를 초기화해야 할 때 자동으로 수행됩니다. 이것이 의미하는 바입니다. 질문을 수정하고 곧 코드 스 니펫을 게시하겠습니다. –