Objective-C 다중 상속


88

하나는 methodA를 포함하고 다른 하나는 methodB를 포함하는 두 개의 클래스가 있습니다. 따라서 새 클래스에서 methodA 및 methodB 메서드를 재정의해야합니다. 그렇다면 목표 C에서 다중 상속을 어떻게 달성합니까? 구문과 약간 혼동됩니다.

답변:


136

Objective-C는 다중 상속을 지원하지 않으며 필요하지 않습니다. 사용 구성 :

@interface ClassA : NSObject {
}

-(void)methodA;

@end

@interface ClassB : NSObject {
}

-(void)methodB;

@end

@interface MyClass : NSObject {
  ClassA *a;
  ClassB *b;
}

-(id)initWithA:(ClassA *)anA b:(ClassB *)aB;

-(void)methodA;
-(void)methodB;

@end

이제 관련 ivar에서 메소드를 호출하기 만하면됩니다. 더 많은 코드이지만 Objective-C의 언어 기능으로서 다중 상속이 없습니다.


8
특히 코드에 대해 많은 단위 테스트를 수행하는 경우 구성이 상속보다 더 나은 접근 방식입니다. 클래스 자체를 재정의하지 않고도 구현을 쉽게 교체 할 수 있다는 점에서 훨씬 더 많은 유연성을 제공합니다. ClassA와 ClassB를 모의 객체로 바꾸고 싶을 때 특히 편리합니다. 런타임에서도 구현 (예 : FTPFileStore 대 LocalFileStore)을 교체하면 구성이 더 깔끔해집니다. 그렇다고 상속이 그 자리를 차지하지 않는다는 의미는 아니지만 다중 상속이 필요하다는 것은 내 디자인을 다시 생각한다는 것을 암시합니다.)
— d11wtq

1
나는 이것을 이해하지 못한다. 당신은 인스턴스화 할 필요가 없습니다 ClassA와 ClassB? 호출 하는가 methodA:에 MyClass어떻게 든 자동으로 호출 methodA:에 ClassA?
— zakdances

1
아니요,하지만 OOP가 원래 작동해야했던 방식 인 메시지 전달을 통해 여전히 동작을 공유 할 수 있습니다. 즉시 상속이 필요하다고 생각하지 않고 대신 구성을 사용하는 솔루션을 고려한다면보다 유지 관리 가능한 방식으로 프로그램을 구조화하기 시작할 것입니다. 물론 ObjC는 그것을 사용하는 것이 옳은 경우에 대한 기본적인 상속을 가지고 있습니다.
— d11wtq 2013 년


1
d11wtq, 훌륭한 답변입니다! 또한 메시지 전달을 사용하면 methodA 및 methodB를 다시 구현하는 단계를 건너 뛸 수 있습니다. 약간의 작업만으로 메시지를 적절한 개체에 자동으로 전달할 수 있습니다. developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
— arsenius

3

이것이 내가 singletonPattern을 "부모"로 코딩하는 방법입니다. 기본적으로 프로토콜과 카테고리의 조합을 사용했습니다.

내가 추가 할 수없는 유일한 것은 새로운 "ivar"이지만 연관된 객체로 푸시 할 수 있습니다.

#import <Foundation/Foundation.h>
@protocol BGSuperSingleton
+(id) singleton1;
+(instancetype)singleton;
@end

@interface NSObject (singleton) <BGSuperSingleton>

@end

static NSMutableDictionary * allTheSingletons;

+(instancetype)singleton
{
    return [self singleton1];
}
+(id) singleton1
{
    NSString* className = NSStringFromClass([self class]);

    if (!allTheSingletons)
    {
        allTheSingletons = NSMutableDictionary.dictionary;
    }

    id result = allTheSingletons[className];

    //PO(result);
    if (result==nil)
    {
        result = [[[self class] alloc]init];
        allTheSingletons[className]=result;
        [result additionalInitialization];
    }
    return result;
}

-(void) additionalInitialization
{

}

클래스가이 BGSuperSingleton을 "상속"하고 싶을 때마다 다음을 수행합니다.

#import "NSObject+singleton.h"

추가 @interface MyNewClass () <BGSuperSingleton>


2
카테고리는 다중 상속이 아닙니다. 이미 존재하는 클래스에 메서드 / 함수를 고정하는 방법입니다. 다중 상속을 사용하면 세 번째 클래스가 하나의 OR MORE 클래스 (변수 포함)의 조합이 될 수 있습니다. 나는 카테고리를 좋아합니다. 카테고리는 매우 유용합니다. 그러나 그들은 다중 상속이 아닙니다.
— Lloyd Sargent 2013 년

그러나 UIViewController의 하위 클래스는 또한 "지원"할 수 있습니다.이 경우에는 싱글 톤 패턴을 원합니다.
— Septiadi Agus 2013-06-20

기술적으로 모든 NSManagedObject는 "이제 [obj singleton]을 호출 할 수 있습니다". 나는 프로토콜의 지원으로 내가 원하는 것을 설정합니다. 어쨌든 다중 상속만큼 좋습니다. 이것은 부모의 인터페이스와 구현을 모두 지원하기 위해 자식 클래스를 원하는 경우에만 해당됩니다. 구현 만 있다면 분명히 구성이 갈 길입니다.
— Septiadi Agus 2013-06-20

<BGSuperSingleton>과 같은 프로토콜을 추가하는 것만으로는 클래스가 "singleton"메소드를 호출 할 수 없습니다. 당신은 여전히 ... 그것을 구현해야
— CommaToast

-4

프로토콜에 대해 알고 있습니까? 프로토콜은 다중 상속을 구현하는 방법입니다.


12
+1 "계층 적으로 관련되지 않은 클래스 간의 유사성을 포착합니다." developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
— pokstad 2012

7
이 경우 두 방법이 모두 재정의되는 경우 프로토콜이 트릭을 수행합니다. 코드를 재사용하기 위해 상속을 사용하려는 다른 경우에는 프로토콜이 도움이되지 않습니다. 그러나 이것은 일반적으로 클래스 수퍼 클래스가 서로 상속하도록하거나 이들을 결합하여 해결할 수 있습니다. 서브 클래스가 실제로 코드를 2 개의 클래스와 공유하는 경우 일반적으로 올바른 방법이 있습니다.
— jake_hetfield

프로토콜을 범주 또는 구성과 결합 할 수 있습니다.
— Septiadi Agus 2013-06-20

-1은 프로토콜이 다중 상속을 위해 존재하지 않기 때문입니다. 마찬가지로에서 JAVA, Interfaces제공하거나 모방 다중 상속 할 수 없습니다.
— thesummersign

1
@FreeAsInBeer Apple의 자체 문서 에서 가져온 프로토콜은 모든 클래스가 구현하도록 선택할 수있는 프로그래밍 인터페이스를 선언합니다. 프로토콜을 사용하면 상속으로 멀리 떨어진 두 클래스가 서로 통신하여 특정 목표를 달성 할 수 있습니다. 따라서 하위 분류에 대한 대안을 제공합니다. . 보시다시피 Apple은 명시 적으로 상속을 사용하고 있습니다. 아마도 Nikesh가 자신의 답변에 이것을 포함하면 그의 주장을 명확히하는 데 도움이 될 것입니다
— Honey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.