C #이 다중 상속을 지원하지 않는 이유는 무엇입니까?


10

그것이 나쁜 관행 일 수도 있지만, 그것이 목적을 달성 할 시간이 있다고 말할 수 있습니다.


1
Microsoft가 생산하는 모든 분야에서 완전히 유용한 기능이 없기 때문에 모든 사람들이 이러한 변명을하는 방법을 좋아합니다 (MVP는 특히 이에 능숙합니다). 내 생각에 다중 상속의 이점을 이해하지 못하는 사람들은 대부분 상속을 처음부터 이해하지 못하고 사용하지 않는 사람들이라고 생각합니다. 거의 모든 프로젝트에서 볼 수있는 코드 20 배입니다. 마이크로 소프트가 MI를 구현하기로 결정했다면 의심 할 여지없이 모든 사람들이 갑자기 열광적 인 애호가가되어 "전도자"를 기다리지 말고

1
@DaveZiffer 일 것입니다.하지만 제대로 이해하기가 어렵습니다. 실제로 잘 작동하는 언어 나 구현에 대해 알고 있습니까?

4
@ 데이브 또는 당신은 그 유용성을 과대 평가합니다. 일반적으로 상속은 과대 평가되며 누락 된 사례는 인터페이스와 구성을 사용하여 쉽게 모델링 할 수 있습니다. 다중 상속은 실제로 C #에서 쓸모가 없습니다. 유일한 이점은 인터페이스 메소드를 복합 멤버의 구현에 수동으로 위임 할 필요가 없다는 것입니다. 이것은 더 잘 풀릴 수 있었지만 (예 : 믹스 인 도입) 다중 상속을 도입 할 이유는 없습니다.
Konrad Rudolph

나는 여러 해 동안 자바에서 OO를 코딩 해 왔으며 이제는 상속을 합리적으로 사용하고 있습니다. 현재 디자인을 단순화하는 데 사용할 수 있었으며 여러 상속을 필요로하지 않고 다시 디자인 할 수 없었을 때 정확히 0 번 사용하고 전체 디자인을 가지고있는 것보다 낫습니다.
Bill K

답변:


14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c 는이 질문을 잘 다루고 있습니다.

내 생각은 이것이다. 디자이너들은 아마도 좋은 디자인 원칙을 홍보하는 언어를 만들고 싶었을 것이다. 다중 상속이 완벽 할 때가 있습니다. 그러나 규칙보다는 예외이며 매우 쉽게 악용 될 수 있습니다. 그래서 디자이너들은 불가능하게하기로 결정했습니다.

좋은 경우에는 인터페이스를 사용해야합니다. 비록 서툴지 만 그 일들. 하지만 그렇게 많이 필요하지는 않습니다.


8

이유를 설명하기 위해 C ++에서 다중 상속이 지원되지만 MI로 구성한 구성으로 대부분의 작업을 훨씬 깔끔하게 수행 할 수 있으므로 권장하지 않습니다. C ++과 달리 C #은 "하이브리드"유형의 OOP 언어가 아닙니다. 즉, 이전 언어에서 진화하지 않았습니다.

다중 상속이 실제로 필요한 경우 다중 인터페이스를 구현할 수 있습니다.


6

Walter Bright는 MI를 포함하지 않는 D의 제작자이며 전체 C ++ 컴파일러를 직접 작성하는 유일한 사람입니다. 그에 따르면 D에 MI가 부족한 이유는 동시에 효율적이고 간단하며 유용한 MI 시스템을 만들기가 너무 어렵 기 때문입니다. Java와 C #이 비슷한 추론을 사용한다고 생각합니다. Perl 및 Python과 같은 언어는 효율성을 기본 목표로 삼지 않으므로 간단하고 유용하지만 효율적으로 구현하기 어려운 시스템을 갖추고 있습니다. C ++은 목표로 단순성이없는 것처럼 보이므로 거의 아무도 이해하지 못하는 매우 복잡한 시스템을 만들었습니다.

월터가 목표에 맞다고 생각합니다. 이 세 가지 기준을 모두 만족시키는 MI 시스템이있는 언어가있는 경우 의견을 남겨주십시오.


2
Eiffel, Common Lisp 및 Dylan에 대해 어떻게 생각하십니까? 나는 그들 모두가 간단하고 유용하다는 것을 알고 있습니다. 그리고 Common Lisp와 Dylan은 성능면에서 C ++ (및 종종 C)과 경쟁하고 심지어 이길 수 있으므로 효율성을 만족시키는 것으로 보입니다. 내가 에펠 것을 알고 컴파일러는 끔찍하게 느린하지만 난 다음 그것을 생산하는 컴파일 된 코드의 성능에 대해 아무것도 알고있다.
Jörg W Mittag


-1

언어 설계자들은 일반적으로 더 나은 언어가 아닌 더 나은 C ++를 만들고 싶었 기 때문입니다. (그들이 얼마나 성공했는지 토론 할 수 있습니다.)

C ++ 스타일 다중 상속에는 몇 가지 문제가 있으므로 C ++에서 파생되는 사람들은 일반적으로 그것을 생략했습니다 (Java, C #, D). 다른 언어 인 Eiffel과 Common Lisp는 두 가지를 다르게 말하지만 같은 문제가없는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.