public interface IParentInterface
{
// 공통 함수 선언
void CommonFunction();
}
2. 호출하는 Window에 인터페이스 구현
public partial class MainWindow : Window, IParentInterface
{
public MainWindow()
{
InitializeComponent();
childControl.MyParent = this;
}
// IParentInterface의 메서드 실제 구현
public void CommonFunction()
{
MessageBox.Show("CommonFunction이 호출되었습니다");
}
}
3. 자식 컨트롤 상세 구현
public partial class MyChildControl : UserControl
{
// 부모 인터페이스를 참조할 속성
public IParentInterface MyParent { get; set; }
public MyChildControl()
{
InitializeComponent();
}
// 버튼 클릭 시 부모의 함수를 호출
private void Button_Click(object sender, RoutedEventArgs e)
{
// 부모 메서드 호출
MyParent?.CommonFunction();
}
}
이렇게 되면 구체적으로 부모 Window가 어떤 Window냐를 따질 필요없이 IParentInterface를 구현하는 부모 Window는 무조건 자식 컨트롤에서 CommonFunction를 호출할 수 있습니다.
흠… 어떤 부분이 이해가 안되시는지 모르겠지만 부가설명을 위해 코드를 짧게나마 작성해뒀는데… 여튼 자식클래스에서 부모클래스로 접근해서 부모클래스 내부 함수를 이용하려면 부모클래스에 접근해서 캐스팅을 해줘야 하잖아요?? 유저컨트롤(자식클래스)을 여러 화면에 붙였을 경우 부모컨트롤(부모클래스)을 캐스팅을 해줘야 하는데 부모컨트롤(부모클래스)이 전부다 다릅니다. 이럴 경우 전부다 IF문으로 비교를 해서 캐스팅을 해줄텐데 이걸 안하고 부모클래스의 타입을 불러와 캐스팅을 시켜줄 수 있는지가 궁금했던 겁니다. 윗분은 다른 대안을 알려주신거고요~
인터페이스는 처음 질문해주신 케이스에도 자주 쓰지만 반대의 경우도 많이 씁니다.
하나의 부모 클래스 + 다양한 자식 클래스인 경우입니다.
예컨대, List와 같이 Generic List에 인터페이스를 담을 경우,
특정한 타입에 구애받지 않고 자식 요소들을 활용할 수 있습니다.
인터페이스 정의
public interface IHasId
{
int Id { get; set; }
void SendPacket();
}
서로 다른 class 정의
// 클래스1. ucDisplay
public class ucDisplay : IHasId
{
public int Id { get; set; }
public ucDisplay(int id)
{
Id = id;
}
public void SendPacket()
{
// ...
}
}
// 클래스2. ucTag
public class ucTag : IHasId
{
public int Id { get; set; }
public ucTag(int id)
{
Id = id;
}
public void SendPacket()
{
// ...
}
}
부모 객체에서의 활용
public partial class Form1 : Form
{
// IHasId 인터페이스를 구현한 객체들을 담는 리스트 (형식 상관X)
private List<IHasId> objList = new List<IHasId>();
private void Form1_Load(object sender, EventArgs e)
{
// ucDisplay와 ucTag 객체를 생성하여 objList 리스트에 추가
// 형식이 달라도 상관없다👍
objList.Add(new ucDisplay(101));
objList.Add(new ucTag(202));
// 리스트의 각 요소 Id를 콘솔에 출력, SendPacket 메서드를 호출
foreach (var item in objList)
{
Console.WriteLine("Id: " + item.Id);
item.SendPacket();
}
}
}
아하… 컨트롤에 다른 컨트롤 넣은 상황에서 .parent 키워드로 부모컨트롤에 접근을 하니 부모 , 자식이라 표현을 했는데 상속관계에서도 부모 , 자식이란 표현을 쓰는군요;; 몰랐습니다. 상속관계는 기본 , 파생이라 표현하는지 알고;; 이해가 안되실만 하셨네요~! 이벤트를 통한 접근 샘플도 감사합니다!