Имитировать абстрактные классы и абстрактные методы в Objective C?

Возможный дубликат:
Создание абстрактного класса в Цель C

В Java мне нравится использовать абстрактные классы, чтобы убедиться, что несколько классов имеют одинаковое базовое поведение, например:

public abstract class A
{
// this method is seen from outside and will be called by the user
final public void doSomething()
{
// ... here do some logic which is obligatory, e.g. clean up something so that
// the inheriting classes did not have to bother with it

reallyDoIt();
}
// here the actual work is done
protected abstract void reallyDoIt();

}

Теперь, когда класс B наследуется от класса A, ему нужно реализовать только reallyDoIt().

Как это сделать в Objective C? Это вообще возможно? Возможно ли это в Objective C? Я имею в виду, что в Objective C вся парадигма, например, насколько я понимаю, нет способа запретить переопределение метода (например, в Java с 'final')?

Спасибо!


person iseeall    schedule 27.06.2012    source источник
comment
См. Эту ветку http://stackoverflow.com/questions/1034373/creating-an-abstract-class-in-objective-c   -  person Hamed Rajabi    schedule 27.06.2012


Ответы (2)


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

Решение для абстрактного класса в цели c может быть:

interface MyClass {

}

- (id) init;

- (id) init {
   [NSException raise:@"Invoked abstract method" format:@"Invoked abstract method"]; 
   return nil;
}

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

person giorashc    schedule 27.06.2012
comment
Спасибо, на самом деле я думал об этом. Я просто надеялся, что есть способ сообщить программисту, реализующему наследующий класс, во время компиляции, что метод отсутствует, а не во время выполнения. - person iseeall; 27.06.2012
comment
Разве это не приведет к краху всего if (self = [super init]) {...} return self; подклассов? - person Kris; 24.11.2016

Вы захотите использовать что-то под названием Protocols < / a> Думаю.

person Dan Lister    schedule 27.06.2012
comment
+1 И вы могли бы добавить, что Objective-C - это язык, который больше полагается на соглашения, чем на соблюдение правил. Как разработчику вам придется придерживаться этих соглашений, чтобы все работало гладко. - person cli_hlt; 27.06.2012
comment
Протоколы [почти] эквивалентны интерфейсам в Java. Так что это не совсем то, что может понадобиться OP. - person Eimantas; 27.06.2012
comment
Я не думаю, что абстрактные классы и протоколы абсолютно одинаковы. Примите во внимание: Животное * утка = [Утка новая]; Протоколы не работают как супертипы вроде этого. Такая конструкция может позволить динамически принимать подклассы в качестве параметров. - person smileBot; 14.02.2014