Подтвердить что ты не робот

Может ли интерфейс Objective c иметь более одной реализации?

Может ли интерфейс Objective c иметь более одной реализации? Пример: я мог бы иметь интерфейс, но 2 реализации, где я использую массивы или другие, где я использую stack..etc для его реализации.

Если так, как вы это называете/синтаксисом?

4b9b3361

Ответ 1

Objective-C имеет концепцию протокола, которая является спецификацией интерфейса. Через протоколы Objective-C полностью поддерживает множественное наследование спецификации (но не реализацию). Итак, немного смутно, синтаксис @interface фактически определяет класс (реализацию), который поддерживает только одно наследование, но может определять реализацию многократного наследования протоколов или спецификаций интерфейсов. В конце концов, это очень похоже на Java.

Например:

@protocol SomeInterface
- (void)interfaceMethod1;
- (void)interfaceMethod2;
@end

@interface SomeClass:NSObject <SomeInterface>
@end 

@interface AnotherClass:NSObject <SomeInterface>
@end 

Экземпляры либо SomeClass, либо AnotherClass утверждают, что они обеспечивают реализацию, необходимую для протокола SomeInterface.

Objective-C является динамически типизированным и не требует, чтобы объект фактически указывал отправленное ему сообщение. Другими словами, вы можете без разбора вызывать любой метод, который вы хотели бы на SomeClass, независимо от того, указан он в нем или какой-либо из его протоколов или не (не то, что это обязательно будет продуктивным или положительным вещь которую нужно сделать).

Таким образом, все следующее будет компилироваться (хотя и с предупреждениями) и работать нормально, хотя сообщения/методы без реализации в этом случае в принципе не работают. Objective-C имеет довольно сложный (и очень классный) процесс обработки/вызова метода обработки, который немного выходит за рамки этого вопроса.

SomeClass * someObject = [[SomeClass alloc] init;
[someObject someUnspecifiedMethod];  // Compiles with warning - no op
[someObject interfaceMethod1];

Если вы хотите определить что-то, что может быть любым типом класса (@interface), но реализует определенный интерфейс (@protocol), вы можете использовать что-то вроде этого:

id <SomeInterface> obj;

obj может содержать объект SomeClass или AnotherClass.

Ответ 2

Возможно, вам стоит попробовать шаблон Cocoa, называемый Class Cluster. Чтобы начать использовать его, вам нужно создать открытый класс под названием SomeClass и два частных подкласса SomeArrayClass и SomeStackClass. Когда вам нужно использовать стек, ваш публичный конструктор классов создаст экземпляр SomeStackClass и вернет его как общедоступный экземпляр SomeClass.

Ответ 3

(Если вы дадите это голосование, пожалуйста, дайте римский голос - его ответ был первым, правильный, просто не было примера).

Вы говорите о кластере классов. Например, посмотрите класс NSString.

Существует NSString:

@interface NSString : NSObject

И NSMutableString:

@interface NSMutableString : NSString

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

Теперь, очевидно, реализация всей изменчивости через - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString (один основной метод) была бы крайне неэффективной. Таким образом, во время выполнения вы заметите, что у вас никогда не было экземпляра NSString или NSMutableString, но только экземпляры подклассов (которые, на самом деле, не являются подклассами... но они также могут быть в контексте этого обсуждение).

И эти подклассы - класс реализации, используемые во время выполнения - переопределяют практически все методы NSString и NSMutableString для обеспечения высоко оптимизированных реализаций конкретных операций.

Итак, вы бы сделали что-то вроде:

@interface MyAbstractClass : NSObject
... declare factory methods here ...
... declare core methods here ...
@end

@interface MyAbstractClass(AdditionalFunctionality)
... declare convenience here ...
@end

Затем в реализации реализуем все основные методы как @throw @"Must use subclass" и все методы AdditionalFunctionality в терминах основных методов.

Это может быть полностью личное - даже не в заголовке:

@interface MyStackClass: MyAbstractClass  @end

@implementation MyStackClass  ... реализовать основные методы и переопределить дополнительные функции функциональности, которые нуждаются в оптимизации...  @end

Повторите для своих дополнительных типов классов. Затем реализуйте методы factory на MyAbstractClass, которые при необходимости возвращают экземпляры подклассов.

Ответ 4

Вы имеете в виду, например, следующее:

@interface MasterViewController : 
  UIViewController <GKPeerPickerControllerDelegate, 
                    GKSessionDelegate,
                    UITextFieldDelegate,
                    UITableViewDelegate,
                    AVAudioRecorderDelegate> {
}