Может ли интерфейс Objective c иметь более одной реализации? Пример: я мог бы иметь интерфейс, но 2 реализации, где я использую массивы или другие, где я использую stack..etc для его реализации.
Если так, как вы это называете/синтаксисом?
Может ли интерфейс Objective c иметь более одной реализации? Пример: я мог бы иметь интерфейс, но 2 реализации, где я использую массивы или другие, где я использую stack..etc для его реализации.
Если так, как вы это называете/синтаксисом?
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
.
Возможно, вам стоит попробовать шаблон Cocoa, называемый Class Cluster. Чтобы начать использовать его, вам нужно создать открытый класс под названием SomeClass
и два частных подкласса SomeArrayClass
и SomeStackClass
. Когда вам нужно использовать стек, ваш публичный конструктор классов создаст экземпляр SomeStackClass
и вернет его как общедоступный экземпляр SomeClass
.
(Если вы дадите это голосование, пожалуйста, дайте римский голос - его ответ был первым, правильный, просто не было примера).
Вы говорите о кластере классов. Например, посмотрите класс 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, которые при необходимости возвращают экземпляры подклассов.
Вы имеете в виду, например, следующее:
@interface MasterViewController :
UIViewController <GKPeerPickerControllerDelegate,
GKSessionDelegate,
UITextFieldDelegate,
UITableViewDelegate,
AVAudioRecorderDelegate> {
}