닷넷이나 자바 같은 객체지향(Object-Oriented Programming, OOP) 언어에서는 다중상속이 되지 않습니다.
'C++'에서는 다중상속은 권장하지 않습니다.
부모가 여럿이면 어느 유전자가 어디서 왔는지 추적하기가 힘들기 때문입니다.
만약 다중 상속을 하려고 하면 다음과 같은 메시지가 나옵니다.
'WpfApplication1.MainWindow' 클래스는 여러 개의 기본 클래스('System.Windows.Window' 및 'baseTest')를 가질 수 없습니다.
개족보 만들지 말라는 오류입니다 ㅡ,.ㅡ;
그런데 프로그램을 만들다 보면 베이스를 여러 개 만들어야 할 경우가 생깁니다.
대표적인 경우가 툴에서 생성해주는 컨트롤에 베이스를 붙일 때입니다.
둘다 이미 'Window'를 상속 받았기 때문에 '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 키워드를 사용하십시오.
당연히 이런 경고는 그때그때 해결하고 넘어가야 예상치 못한 에러를 막을 수 있습니다.
이런 이유로 가능하면 상속을 쓰지 말라는 이야기를 자주 볼 수 있습니다.
"앵? 상속은 객체지향의 꽃 아닌가요??"
라고 할 수 있겠지만 상속이 너무 많이 쌓이면 오히려 코드를 해치게 됩니다.
그래서 변수선언으로 대처가 가능한 상황에서는 안 쓰는 것이 좋습니다.
상속의 안 좋은 예를 보겠습니다.
public class AttrObject
{
public int ID { get; set; } = 0;
}
public class AttrDiv : AttrObject
{
public string Name { get; set; } = String.Empty;
public int Type { get; set; } = 0;
}
public class AttrDetail: AttrDiv
{
public int Age { get; set; } = 0;
}
public class Human: AttrDetail
{
}
이런 단순 속성 나열 같은 정보는 상속보다는 인스턴스를 변수에 담아 사용하는 편이 났습니다.
아래와 같이 말이죠.
public class AttrObject
{
public int ID { get; set; } = 0;
}
public class AttrDiv
{
public string Name { get; set; } = String.Empty;
public int Type { get; set; } = 0;
}
public class AttrDetail
{
public int Age { get; set; } = 0;
}
public class Human
{
public AttrObject Attr {get; set;} = new AttrObject();
public AttrDiv Div { get; set; } = new AttrDiv();
public AttrDetail Detail { get; set; } = new AttrDetail();
}
물론 이것도 정답이 아닌 게 상황에 따라서는 단순 속성 나열도 상속하는 게 맞는 경우가 있습니다.
설계에는 정답이란 게 없기 때문이죠.
이런 포스팅은 항상 원론적인 결론에 도달합니다.
'필요에 따라서 적절하게 사용하라'