Objective c 如何围绕缺少';朋友';目标C的能力?

Objective c 如何围绕缺少';朋友';目标C的能力?,objective-c,Objective C,假设我有3个类,一个控制器对象controller和两个模型对象Foo和Bar 假设Foo和Bar有一个stop方法,该方法只能由Controller方法调用,而不能由其他类直接调用 如何使其他类直接在Foo和Bar上调用stop,它们(理想情况下)得到编译时警告或运行时警告 注意,这是为了停止意外调用错误的方法,而不是需要安全的方法。如果需要,可以重写stop方法,但最好不用重写 我目前的想法是: 1) 在Foo和Bar上定义一个Controller类别,并将停止方法移到那里。将它放在一个单独

假设我有3个类,一个控制器对象
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以外的文件中,那就太酷了。