假设我有3个类,一个控制器对象Controller
和两个模型对象Foo
和Bar
。
假设Foo
和Bar
有一个stop
方法,该方法只能由Controller
方法调用,而不是由其他类直接调用
如何使其成为如果任何其他类直接在stop
和Foo
上调用Bar
,它们(理想情况下)得到编译时警告或(次佳)运行时警告?
注意,这是为了阻止意外调用错误的方法,而不是需要安全的东西。如果需要,可以重写stop
方法,但不必这样做。
我目前的想法是:
1)在Controller
和Foo
上定义Bar
类别,然后在那里移动停止方法。把它放在一个单独的文件中,所以你不得不自己导出它(但是如果有人这样做的话,这不会导致编译警告 - 但至少应该更清楚地说这不是预期的使用方法班级)
2)在方法中添加sender
参数,并在运行时检查它是[Controller class]类型。
但这些都不是理想的,因为它们都容易出错。对于这种事情,是否有更好的客观模式?
答案 0 :(得分:3)
您可以在一个单独的文件中添加一个类别(例如:@interface Foo (Friends)
),您可以在其中声明只能由Controller
使用的方法。
富+ 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 :(得分:1)
一种选择可能是在-stop
方法中无条件地抛出异常。正确调用该方法的代码将捕获异常并忽略它;天真地调用它的代码不会期望异常,并且可能会因未捕获的异常错误而崩溃。
当没有什么是真正的错误时,我并没有为抛出异常而疯狂,但是你担心可能错误,所以它并不可怕。
更好的选择是考虑为什么要限制-stop
对Controller类的使用,并尝试重构代码以避免这种情况。模型对象不应该知道有关使用它们的控制器的任何信息,因此消除这种依赖性似乎是一个好主意。