Протоколы Objective-C, имитирующие «виртуальные функции», дают предупреждения компилятора? - PullRequest
2 голосов
/ 17 сентября 2009

В Objective-C я хотел бы заставить производные классы реализовывать данный интерфейс без предоставления реализации по умолчанию (реализация в родительском классе).

Я понимаю, что протоколы могут быть использованы для этого, и я думаю, что я понимаю, как использовать протоколы, но я, очевидно, что-то упускаю ...

Я определил класс Parent и вывел несколько дочерних классов из parent. Все дочерние классы соответствуют протоколу, который требует реализации myMethod.

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

Компилятор - что неудивительно - предупреждает, что Parent может не отвечать на myMethod.

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

Чего мне не хватает?

Спасибо

Ответы [ 2 ]

3 голосов
/ 17 сентября 2009

Это не то, как протоколы предназначены для использования. Протокол - это интерфейс без реализации. Если класс утверждает, что он соответствует протоколу (как, очевидно, делает ваш родительский класс), ему необходимо реализовать методы, иначе вы получите предупреждение. Вы хотите, чтобы все классы, которые на самом деле реализуют протокол, объявляли, что они ему соответствуют, и вместо того, чтобы ссылаться на них по имени этого родительского класса, именуйте их как id<ProtocolNameHere>. Это объявляет, что они являются объектами, соответствующими этому протоколу.

2 голосов
/ 17 сентября 2009

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

Посмотрите мой учебник Наследование или протоколы? о том, как работают протоколы и когда их использовать вместо наследования. Включено множество примеров кода и обсуждение того, как можно использовать протоколы, а не категории в качестве аналогов Objective C для абстрактного класса других языков. Удачи в развитии!

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