2010-11-16 5 views
85

У меня есть 2 класса, один из которых включает метод А, а другой включает метод B. Поэтому в новом классе мне нужно переопределить методы methodA и methodB. Итак, как мне добиться множественного наследования в объективном C? Я немного смущен синтаксисом.Objective-C множественное наследование

ответ

127

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. Это больше кода, но просто не множественное наследование как функция языка в объективе-C.

+8

Состав очень часто лучший подход взять, чем наследование, особенно если вы сделать много модульного тестирования кода. Это дает гораздо большую гибкость в том, что вы можете легко заменить реализации без переопределения самого класса. Особенно удобно, когда вы хотите, скажем, обменять ClassA и ClassB на макет объектов. Даже во время выполнения изменений (например, FTPFileStore против LocalFileStore) становится более чистым с композицией. Это не означает, что наследование не имеет своего места, но потребность в множественном наследовании предполагает, что я передумаю мой дизайн;) – d11wtq

+1

Я этого не понимаю. Вам не нужно создавать экземпляры 'ClassA' и' ClassB'? Вызывает ли метод 'methodA:' на 'MyClass' как-то автоматически вызывать' methodA: 'на' ClassA'? – zakdances

+1

Нет, но вы все равно можете делиться своим поведением посредством передачи сообщений, как предполагалось, должно было работать ООП. Если вы не сразу перейдете к мысли, что вам нужно наследование, и вместо этого рассмотрите решение с использованием композиции, вы обнаружите, что вы начнете структурировать свои программы более удобным образом. Конечно, ObjC имеет базовое наследование для случаев, когда правильно использовать его. – d11wtq

-2

вы знаете о Протоколах, протоколы являются способом реализации множественного наследования

+58

-1: Протоколы * очень * отличаются от использования наследования. – FreeAsInBeer

+12

+1 «Захват сходства между классами, которые не связаны иерархически». https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html – pokstad

+7

В этом случае, когда оба метода будут переопределены, протоколы будут делать трюк. В других случаях, когда вы хотите использовать наследование для повторного использования кода, протоколы не помогут. Однако это обычно можно решить, если позволить классам суперклассов наследовать друг от друга или, объединив их, обычно есть способ сделать это правильно, если подкласс действительно использует код с двумя классами. –

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

Категории не являются множественным наследованием. Это способ применения методов/функций к уже существующему классу. Множественное наследование позволяет третьему классу быть комбинацией одного класса ИЛИ БОЛЕЕ (включая переменные). Мне нравятся категории. Категории очень полезны. Но они НЕ являются множественным наследованием. –

+0

Но подкласс UIViewController также может «поддерживать», в данном случае, одноэлементный шаблон, который я должен пожелать. –

+0

Технически все NSManagedObject «теперь могут вызывать» [obj singleton]. Я поставил те, кого хочу, с поддержкой протокола. Так или иначе, как множественное наследование. Это только в том случае, если я хочу, чтобы дочерний класс поддерживал интерфейс и реализацию родителя. Если только реализация, то, очевидно, композиция - путь. –

Смежные вопросы