2010-07-16 2 views
4

У меня есть протокол.Совместное использование общего метода между классами, реализующими один и тот же протокол в Objective C

MyProtocol.h:

@protocol MyProtocol 
    @property(nonatomic, retain) NSString* someString; 
    - (void)doesSomethingWithSomeString; 
@end 

и 2 классов, которые реализуют один и тот же протокол. По какой-то причине 2 класса не могут наследовать один и тот же базовый класс. Например. 1 из них, возможно, потребуется наследовать от NSManagedObject (класс Core Data в структуре Apple Cocoa), а другой - нет.

Class1.h:

@interface Class1: NSObject<MyProtocol> { 
    NSString* someString; 
} 

//Some method declarations 

@end 

Class1.m

@implementation Class1 
    @synthesize someString; 

    - (void)doesSomethingWithSomeString { 
    //don't use property here to focus on topic 
    return [[self someString] capitalizedString]; 
    } 

    //Method definitions for methods declared in Class1 
@end 

Class2.h:

@interface Class2: SomeOtherClass<MyProtocol> { 
    NSString* someString; 
} 

//Some method declarations 

@end 

Class2.m

@implementation Class2 
    @synthesize someString; 

    // This is exactly the same as -doesSomethingWithSomeString in Class1. 
    - (void)doesSomethingWithSomeString { 
    //don't use property here to focus on topic 
    return [[self someString] capitalizedString]; 
    } 

    //Method definitions for methods declared in Class2 
@end 

Как избежать дублирования -doesSomethingWithSomeString? (Думаю, мне нужно что-то вроде категорий для нескольких классов).

Update:

Там были некоторые предложения вспомогательного класса и делегирование звонков от Class1 и Class2 к нему. Это может быть хороший подход в целом, особенно если методы длинны.

В этом случае я рассматриваю Class1, наследующий от NSObject и Class2, наследующий от NSManagedObject. Последний является базовым классом, который Class2 должен подклассифицировать как модель/объект в структуре данных Apple Core Data.

Так что, хотя делегирование в третий класс является одним из способов сделать это, должно быть много кода оболочки делегирования делегирования, что составляет много коротких 1-2 методов в 3-м классе. т.е. высокий код делегирования шаблона для фактического кода.

Еще один момент, так как это модель класса, общий код в основном действует на Иварс/свойства, класс делегация будет в конечном итоге написано почти как глобальные функции C ..

ответ

2

Вы можете создать вспомогательный класс ап затем используйте его из Class1 и Class2, и тогда будет дублироваться только вызов метода на вспомогательном классе.

+0

Добавлено обновление в вопросе об использовании класса-помощника/делегированного. –

2

Эта ситуация указывает, что ваши Class1 и Class2 не полностью учитываются в классах, которые обрабатывают только одну проблему. Тот факт, что у вас есть общая реализация, указывает на то, что должен быть третий класс, который обеспечивает эту реализацию, и к которой Class1 и Class2 могут делегировать эту проблему. Другими словами, это случай для композиции вместо наследования.

Update Если это не имеет смысла делегировать класс, не забывайте, что Objective-C является надстройкой C. Там ничего от вас очистной реализации библиотеки функций C, которые вы можете позвонить из обоих классов, чтобы инкапсулировать общее поведение. Если вы привержены идеям, таким как NSAssert и др., вы всегда можете реализовать их как методы класса в классе или категории полезности на NSObject.

+0

Добавлено обновление, о котором идет речь об использовании вспомогательного/делегированного класса. –

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