Objective c 如何围绕缺少';朋友';目标C的能力?
假设我有3个类,一个控制器对象Objective c 如何围绕缺少';朋友';目标C的能力?,objective-c,Objective C,假设我有3个类,一个控制器对象controller和两个模型对象Foo和Bar 假设Foo和Bar有一个stop方法,该方法只能由Controller方法调用,而不能由其他类直接调用 如何使其他类直接在Foo和Bar上调用stop,它们(理想情况下)得到编译时警告或运行时警告 注意,这是为了停止意外调用错误的方法,而不是需要安全的方法。如果需要,可以重写stop方法,但最好不用重写 我目前的想法是: 1) 在Foo和Bar上定义一个Controller类别,并将停止方法移到那里。将它放在一个单独
controller
和两个模型对象Foo
和Bar
假设Foo
和Bar
有一个stop
方法,该方法只能由Controller
方法调用,而不能由其他类直接调用
如何使其他类直接在Foo
和Bar
上调用stop
,它们(理想情况下)得到编译时警告或运行时警告
注意,这是为了停止意外调用错误的方法,而不是需要安全的方法。如果需要,可以重写stop
方法,但最好不用重写
我目前的想法是:
1) 在Foo
和Bar
上定义一个Controller
类别,并将停止方法移到那里。将它放在一个单独的文件中,这样您就必须不厌其烦地导入它(但是,如果有人这样做,这不会导致编译警告-但至少应该清楚地表明,这不是使用该类的预期方式)
2) 在方法中添加sender
参数,并在运行时检查该参数是否为[Controller class]类型
但这两种方法似乎都不理想,因为它们都有点容易出错。对于这类事情有更好的objective-c模式吗?您可以在单独的文件中添加一个类别(例如:@interface Foo(Friends)
),在该文件中声明只能由控制器使用的方法
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
方法而不发出任何警告。您可以在一个单独的文件中添加一个类别(例如:@interface Foo(Friends)
),在该文件中声明只能由控制器使用的方法
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
方法,而无任何警告。一个选项可能是在-stop
方法中无条件抛出异常。正确调用该方法的代码将捕获异常并忽略它;天真地调用它的代码不会期望出现异常,并且可能会因未捕获的异常错误而崩溃
我并不热衷于在没有任何问题的情况下抛出异常,但在这里,您担心可能有什么问题,所以这并不可怕
一个更好的选择是考虑为什么要将-stop
的使用限制在控制器类中,并尝试重构代码以避免这种情况。模型对象不必知道使用它们的控制器的任何信息,因此消除这种依赖性似乎是个好主意。一个选项可能是在-stop
方法中无条件抛出异常。正确调用该方法的代码将捕获异常并忽略它;天真地调用它的代码不会期望出现异常,并且可能会因未捕获的异常错误而崩溃
我并不热衷于在没有任何问题的情况下抛出异常,但在这里,您担心可能有什么问题,所以这并不可怕
一个更好的选择是考虑为什么要将-stop
的使用限制在控制器类中,并尝试重构代码以避免这种情况。模型对象不必知道使用它们的控制器的任何信息,因此消除这种依赖性似乎是一个好主意。是的,这可能就是我要做的-这基本上是我上面的观点1)。如果有一种方法(编译器)警告不要将文件包含在Controller.m tho以外的文件中,那就太酷了。是的,这可能就是我要做的——这基本上是我上面的观点1)。如果有一种方法(编译器)警告将文件包含在Controller.m tho以外的文件中,那就太酷了。