2013-08-12 5 views
0

Я знаю, что Objective-C не поддерживает абстрактные классы, но это, тем не менее, язык OO (http://en.wikipedia.org/wiki/Objective-C). Поэтому у меня есть несколько объектов с теми же методами, кроме одного, и я хотел бы следовать принципу DRY и не повторять много одного и того же кода в нескольких классах. Каков наилучший способ сделать это?реализация «шаблона метода шаблона» в объекте c

+0

Обычный суперкласс кажется правильным решением. –

+1

.... иначе известный как ** Абстрактный суперкластер **. См. Кластерные кластеры как один из наиболее широко используемых примеров такого шаблона. – bbum

+0

Спасибо, это то, что я ожидал услышать. – pvllnspk

ответ

1

Так что у меня есть несколько объектов с теми же методами, кроме одного, поэтому я хотел бы следовать принципу DRY и не повторять много одного и того же кода в одном месте.

Я предполагаю, что вы имеете в виду «У меня есть несколько классов с тем же методами, за исключением одного».


Это зависит от того, насколько формально вы хотите быть в целом. Все начинается с базового класса, который имеет все общие методы. Я назову это @interface A : NSObject.

Суб-классы A унаследует от A

  • @interface A1 : A
  • @interface A2 : A

Суб-класс, который необходим уникальный метод, который я буду называть B

  • @interface B : A

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

A *a = ... 
if ([a respondsToSelector:@selector(uniqueMethod)]) 
    [(id)a uniqueMethod]; 

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

Другой вариант - проверить принадлежность к классу.

A *a = ... 
if ([a isKindOfClass:[B class]]) 
    [(B *)a uniqueMethod]; 

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

Формальный способ для этого - протоколы. Я создам протоколы для A и B, которые я назову AP и BP. Это изменяет интерфейс для A и B.

  • @interface A : NSObject <AP>
  • @interface B : A <BP>

Теперь тест становится вопросом для соответствия.

A *a = ... 
if ([a conformsToProtocol:@protocol(BP)]) 
    [(id<BP>)a uniqueMethod]; 

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

Надеюсь, что это поможет.

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