Как программировать на предмет отсутствия возможности «друзей» в Objective-C? - PullRequest
1 голос
/ 11 сентября 2011

Допустим, у меня есть 3 класса, один объект контроллера Controller и два объекта модели Foo и Bar.

Предположим, что Foo и Bar имеют метод stop, который предназначен только для вызова только методом Controller и не вызывается напрямую другими классами.

Как я могу сделать так, чтобы, если любой другой класс вызывал stop непосредственно на Foo и Bar, они получали (в идеале) предупреждение о времени компиляции или (следующий лучше) предупреждение о времени выполнения?

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

Мои нынешние идеи:

1) Определите категорию Controller для Foo и Bar и переместите туда метод остановки. Поместите это в отдельный файл, так что вам придется изо всех сил импортировать его (однако это не приведет к предупреждению компиляции, если кто-то сделает это в любом случае - но, по крайней мере, должно прояснить, что это не ожидаемый способ использования класс)

2) Добавьте параметр sender к методам и убедитесь, что он имеет тип [класс контроллера] во время выполнения.

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

Ответы [ 2 ]

3 голосов
/ 11 сентября 2011

Вы можете добавить категорию (например: @interface Foo (Friends)) в отдельный файл, в котором вы объявляете методы, которые могут использоваться только Controller.

Foo + Friends.h:

@interface Foo (Friends)
-(void)stop;
@end

Foo + Friends.m или Foo.m:

#import "Foo+Friends.h"
@implementation Foo (Friends)
-(void)stop{
    // implementation for stop
}
@end

В файлах, куда вы импортируете "Foo + Friends.h" (в вашем случае Controller.m), вы можете получить доступ к методу stop без предупреждения.

1 голос
/ 11 сентября 2011

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

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

Лучшим вариантом было бы подумать о том, почему вы хотите ограничить использование -stop для класса Controller, и попытаться изменить свой код наИзбегайте этого.Объекты модели не должны знать ничего о контроллерах, которые их используют, поэтому устранение этой зависимости может показаться хорошей идеей.

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