Совместное использование реализации общего метода между классами, реализующими один и тот же протокол в Задаче C - PullRequest
5 голосов
/ 16 июля 2010

У меня есть протокол.

MyProtocol.h:

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

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

@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?(Полагаю, мне нужно что-то вроде категорий для нескольких классов).

Обновление:

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

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

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

2 голосов
/ 16 июля 2010

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

0 голосов
/ 19 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...