对于 Objective-C 方法,一般做法是将您希望公开的方法放在@interface
头文件的部分中,以便其他代码只能包含 .h 并知道如何与您的代码交互。基于顺序的“惰性声明”就像 C 中的函数一样工作——您不必声明方法原型,除非您有无法通过排序解决的依赖项,但@implementation
如果需要,您可以在其中添加方法原型。
所以是的,你在正确的轨道上。不要为继承的方法重复方法原型——编译器会在父类的头文件中找到它。委托方法可以定义为类别中的原型(附加到类上)并根据需要实现,但委托不需要提供方法原型,因为它已经定义。(为了清楚起见,它仍然可以,等等。)
由于您只是在学习 Objective-C,因此此答案的其余部分比您要求的要详细得多。你被警告了。;-)
当您静态键入一个变量(例如MyClass*
,而不是id
)时,当您尝试调用一个类没有宣传它实现的方法时,无论它是否实现,编译器都会警告您。如果您动态键入变量,编译器不会阻止您调用您喜欢的任何内容,并且只有在调用不存在的内容时才会出现运行时错误。就语言而言,您可以在运行时调用类实现的任何方法而不会出错——没有办法限制谁可以调用方法。
就个人而言,我认为这实际上是一件好事。我们非常习惯于封装和保护我们的代码免受其他代码的影响,以至于我们有时将调用者视为狡猾的恶棍,而不是值得信赖的同事或客户。我发现以“你做你的工作,我做我的工作”的心态来编码是非常愉快的,每个人都尊重界限并照顾自己的事情。你可能会说,Objective-C 的“态度”是一种社区信任,而不是严格执行。例如,我很乐意帮助任何来到我办公桌前的人,但如果有人在没有询问的情况下弄乱我的东西或移动东西,我会非常生气。精心设计的代码不一定是偏执或反社会的,它只需要很好地协同工作。:-)
也就是说,有很多方法可以构建界面,具体取决于您在向用户公开界面时想要/需要的粒度级别。您在公共标头中声明的任何方法本质上都是公平的游戏,任何人都可以使用。隐藏方法声明有点像锁住你的车或房子——它可能不会让每个人都被拒之门外,但是(1)它“让诚实的人保持诚实”,不会用他们不应该搞砸的东西来诱惑他们,以及(2 )任何进入的人肯定会知道他们不应该这样做,并且不能真正抱怨负面后果。
以下是我用于文件命名的一些约定,以及每个文件中的内容——从底部的 .m 文件开始,每个文件都包含它上面的文件。(使用严格的包含链将防止出现重复符号警告等情况。)其中一些级别仅适用于较大的可重用组件,例如 Cocoa 框架。根据您的需要调整它们,并使用适合您的任何名称。
MyClass.h
— 公共 API(应用程序编程接口)
MyClass_Private.h
— 公司内部 SPI(系统编程接口)
MyClass_Internal.h
— 项目内部 IPI(内部编程接口)
MyClass.m
— 实现,通常是所有 API/SPI/IPI 声明
MyClass_Foo.m
— 附加实现,例如类别
API 是供大家使用的,并且是公开支持的(通常在 中Foo.framework/Headers
)。SPI 为您的代码的内部客户端公开了额外的功能,但要理解支持可能会受到限制,并且接口可能会发生变化(通常在 中Foo.framework/PrivateHeaders
)。IPI 由特定于实现的细节组成,这些细节绝不应该在项目本身之外使用,并且这些标头根本不包含在框架中。任何选择使用 SPI 和 IPI 调用的人都需要自担风险,并且通常会在更改破坏代码时损害他们的利益。:-)