2012-03-26 5 views
2

저는 ECMAScript 배경에서 왔습니다 (매우 C/C++로 보입니다). 따라서 클래스, 개체과 같은 멋진 C++ 스타일 상속을 배웠고 다형성 같은 멋진 것들을 배웠습니다.상속 대신에 컴포지션 사용

최근에 Android 및 iOS 개발을 좋아합니다. Java는 C 기반으로 보입니다. 따라서 C 기반 규칙의 대다수를 사용하여 문제가 없지만 iOS는 다른 방식을 사용합니다. 특히 객체 상속과 같은 방식을 사용하는 것이 좋습니다.

작곡에 강한 의견이있는 것 같기 때문에 부탁드립니다. 지금까지 제가 구성에서 보았던 것에서, 가장 큰 팬이 아니며 입니다. 프로젝트가 작업 할 충분한 이유가없는 한.

Obj-C/iOS 개발자가 있다면 고전적인 상속에 비해 컴포지션을 권장 하시겠습니까? 아니면 상황에 맞는 것입니까?

+1

이것은 잠재적으로 논쟁적인 의견 질문 인 것처럼 보이지만 사실적 대답으로 이어지는 질문은 아닙니다. –

+1

구성은 has-a 관계입니다. 상속은 is-a 관계입니다. has-a 관계는 is-a 관계보다 더 좋은 모듈성을 가진 것처럼 보입니다. – michex

+5

'Please'- ** 게시물 **의 네 번째 ** 단어 **는 *** 필요하지 않습니다 *** to * 'formatted'* 다르게 *. 'Backticks' **는 **'code'를위한 것입니다. –

답변

5

Objective-C의 개체 모델은 C/C++/Java와 매우 다릅니다. 이것은 메시지 기반이므로 C/C++/Java 에서처럼 메소드를 호출하는 것이 아니라 메시지에 응답하는 객체에 더욱 중점을 둡니다.

코코아 라이브러리에 대한 접근 방식은보다 완만 한 개체 상속 계층 구조를 선호하며 사용자 지정을 위임 한 패턴에 의존하고 이러한 개체 계층 구조를 일정하게 유지합니다. 왜 그럴까요? 많은 라이브러리, 특히 GUI는 계층 구조로 인해 복잡해지기 때문에 어떤 클래스를 상속할지 명확하지 않습니다. 비디오 게임에서 가장 현대적인 객체 시스템 (예 : 전문 기술 업계)은 실제 상황에서보다 유연하고 유지하기 쉬운 동작을 혼합하여 객체를 구성하는 컴포지션 패러다임을 사용합니다.

코코아 라이브러리는 컴포지션 모델을 그대로 사용하지 않고 모델 - 뷰 - 컨트롤러 영역 중 하나에서 명확하게 분할 된 클래스 간의 상호 작용을 사용하고 사용자 지정을 위해 위임을 사용합니다. 커스터마이제이션을 핵심 기능과 분리하여 유지하면 복잡성과 계층 구조가 더 평평 해집니다.

0

새로운 클래스가 파생 된 클래스에 대해 일반적으로 Liskov Substitution Principle을 따르는 경우 상속을 사용하고, 그렇지 않으면 composition/aggregation을 선호합니다. 그것은 서로 반대가 아니며 둘 다 널리 사용됩니다.

0

나에게 이것은 어떤 클래스를 사용하고 있는지에 대한 질문입니다. Apple의 핵심 기초 또는 UI 라이브러리를 사용하는 경우 서브 클래 싱을 피하는 것이 좋습니다. 이러한 클래스의 대부분은 구체적인 클래스가 아니라 클래스 클러스터입니다. 이 클래스에서 os는 런타임에 실제로 사용할 클래스를 결정할 수 있습니다.

일반적으로 서브 클래 싱을해야하는 이유가 아니라면 일반적으로 구성을 선호합니다. 서브 클래 싱해야하는 강력한 이유가있을 때도 종종 원래 클래스의 메소드 범주를 만드는 대신 선택합니다.