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
나는 이것을 이해하지 못한다. 당신은 인스턴스화 할 필요가 없습니다 ClassAClassB? 호출 하는가 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.