Вставить класс в иерархию наследования (target-c) - PullRequest
0 голосов
/ 05 октября 2011

Есть ли возможность вставить базовый класс в иерархию наследования? Вот пример:

@interface BaseClass // has a lot of basic functionality and interface
{...}
@end

@interface ChildClass : BaseClass // customizes BaseClass functionality
{...}
@end

@interface BaseClassEx : BaseClass // add some features to base class
{...}
@end

Я хочу, чтобы ChildClassEx имел все методы из ChildClass, но унаследован от BaseClassEx

Ответы [ 3 ]

0 голосов
/ 05 октября 2011

Звучит как множественное наследование.В Objective C его нет.

Исходя из вашего описания, я бы предложил другой шаблон проектирования.

@class BaseUtility // has a lot of basic functionality
{...}
@end

@class BaseClass // has interface
{...}
@property BaseUtility *utility;
@end

@class ChildUtility : BaseUtility // customizes basic functionality
{...}
@end

@class BaseClassEx : BaseClass // add some features to base class
{...}
@end

Теперь у вас может быть четыре вида вещей.

  1. BaseClass с назначенной ему BaseUtility, который похож на ваш BaseClass.
  2. BaseClass с назначенным ему ChildUtility, который похож на ваш ChildClass.Он получает настраиваемое поведение и имеет тот же интерфейс, что и BaseClass.
  3. BaseClassEx с назначенной ему BaseUtility, которая похожа на BaseClassEx.Он имеет дополнительные функции (дополнительный интерфейс, я полагаю).
  4. BaseClassEx с назначенным ему ChildUtility, который похож на ChildClassEx, который вы хотите.Он имеет дополнительные функции и настраиваемую функциональность.

Наследование классов - это шаблон "is".Вышеприведенное объединяет шаблон «есть» и шаблон «имеет».Чтобы получить эффект ChildClassEx, который вы хотите, вы создаете что-то, что «BaseClassEx, но» имеет «ChildUtility».

0 голосов
/ 05 октября 2011

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

@interface BaseClass(BaseClassEx)

// new method declarations

@end

@implementtion BaseClass(BaseClassEx)

// new method definitions

@end

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

0 голосов
/ 05 октября 2011

Почему бы просто не наследовать от ChildClass? Это автоматически наследует все от всех суперклассов

@interface BaseClassEx : ChildClass // add some features...
{...}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...