닷넷이나 자바에서는 다중상속이 되지 않습니다.
C++에서는 다중상속은 권장하지 않죠.

부모가 여럿이면 당연이 어느 유전자가 어디서 왔는지 추적하기가 힘들기 때문입니다.

막장드라마의 개족보가 프로그램에도 존재 하죠 ㅎㅎㅎㅎ

만약 다중 상속을 하려고 하면 다음과 같은 메시지가 나옵니다.

'WpfApplication1.MainWindow' 클래스는 여러 개의 기본 클래스('System.Windows.Window' 및 'baseTest')를 가질 수 없습니다.

개족보 만들지 말라는 오류입니다 ㅡ,.ㅡ;

그런데 프로그램을 만들다보면 베이스를 여러게 만들어야 할경우가 생깁니다.
대표적인 경우가 툴에서 생성해주는 컨트롤에 베이스를 붙일때 입니다.



둘다 이미 Widow를 상속 받았기 때문에 baseTest를 상속받을수가 없습니다.

이럴때 사용하는 방법이 조부모 상속이죠.
조부모 상속은 부모와 조부모같이 여러 조상들을 통해 원하는 베이스를 상속 받는 방법입니다.



위와 같은경우 baseTest가 먼저 Window를 상속받고 그다음 frm1과 frm2가 baseTest를 상속받으면 됩니다.


코드로 보자면


class baseTest : Window
{
	public int Test { get; set; }
}


public partial class MainWindow : baseTest
{
	public MainWindow()
	{
		
	}
}


이렇게 만들면 Winodw와 baseTest에 모두 접근이 가능합니다.
여전이 특성은 같으며 같은 변수를 선언하거나 하면 에러가 아닌 워닝이 납니다 ㅎㅎㅎ

'WpfApplication1.claTes2.Test'은(는) 상속된 'WpfApplication1.baseTest.Test' 멤버를 숨깁니다. 숨기려면 new 키워드를 사용하십시오.

당연이 이런 경고는 그때그때 해결하고 넘어가야 예상치 못한 에러를 막을수 있습니다.






  1. Favicon of https://aterilio.tistory.com BlogIcon Aterilio 2014.05.12 11:05 신고  Address  Edit/Delete  Reply

    둘다 기존 컨트롤을 상속하면 어떻게 해야하나요?
    CustomControlBase가 있고
    TextBox와 함께 상속하고 싶은데

    CustomControlBaseⓐ는 기본(KeyPress등의 이벤트)에 대한 것을 재정의하고,
    TextBox의 기능들을 상속받은 것이 myTextBoxⓑ,
    MaskedTextBox의 기능들을 상속받은 것이 myMaskedTextBoxⓒ라고 할때
    ⓑ, ⓒ 각각은 ⓐ도 상속받아야하고, 각각의 부모도 상속 받아야 하는데요.
    이런걸 해결할 방법은 없나요?

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2014.05.12 17:57 신고  Address  Edit/Delete

      1) 경우의 수만큼 베이스를 만드는 방법이 있습니다.
      CustomControlBaseⓐ1 : TextBox
      CustomControlBaseⓐ2 : MaskedTextBox

      2) 문제는 이렇게 되면 중복코드가 생기는데 중복코드가 싫다면 최대한 인터페이스를 이용해서 다중상속의 모양을 만들어야 합니다.

      3) 위 방법들이 불가능 하다면 상속을 하지말고 그냥 클래스를 인스턴스로 선언하여 사용하는것이 좋습니다.
      당연히 베이스로 쓰려던 클래스에서 정의된 이벤트 같은 것들은 인스턴스로 쓰더라도 응답을 받을 수 있도록 구현 해야 하죠.
      예>
      myTextBoxⓑ : TextBox
      {
      CustomControlBaseⓐ a = new CustomControlBaseⓐ();
      }


      이 내용이 정답이라기 보다는 저는 거의 이런식으로 해결 하고 있습니다.
      다른 분들은 어떤지 모르겠네요.

  2. Favicon of https://aterilio.tistory.com BlogIcon Aterilio 2014.05.21 09:35 신고  Address  Edit/Delete  Reply

    1번의 경우는... 달갑지가 않네요; 안쓰느니만 못한 듯..;
    차라리 컨트롤마다 직접 코딩하는 편이 낫겠습니다..

    2번의 경우에는, 인터페이스를 사용하고 싶지만 (실제로도 다른부분에서는 사용하지만)
    컨트롤 자체를 재정의하는 경우(ⓐ 내부구현 : 배경색을 바꾼다던지, focus올 때의 이벤트 처리라던지) 인터페이스로 구현할 수 없다는 단점이 있네요.

    3번의 경우....는 괜찮은 생각 같습니다.
    하지만 이 경우에도 2번의 문제(단점)가 발생하네요..ㅠㅠ
    ⓐ에 해당하는 이벤트들이나 옵션을 결국 컨트롤마다 재설정해줘야 하니까요...

댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바