我不了解Objective-C中的子类化:例如,我们说NSString继承自NSObject,但NSObject是否也继承了NSString? 我想知道这一点,因为当我创建一个继承自NSObject的新类时,即使我的类没有从NSString继承,我也可以访问NSString。 例如,我可以在继承NSObject形式的类中编写它:
[NSString stringWithFormat:@"Hello world !"];
我不明白的是,即使NSString是NSObject的子类而不是它的超类,我也能做到这一点! !
答案 0 :(得分:3)
当你这样称呼时:
[NSString stringWithFormat:@"Hello world !"];
您正在向stringWithFormat:
发送NSString
,{{1}}将其定义为静态方法(或者更好的术语,类方法)。它与你班级的超类无关。您正在混淆目标C和OOP的基本概念。子类化意味着继承'特征'原始类,并最终扩展其功能。这并不意味着你不能打电话给其他班级。方法
答案 1 :(得分:2)
您可以访问NSString的原因是您提供了导入Foundation。 Foundation包括NSObject和NSProxy中提供的两个公共基类。 你几乎需要所有的Foundation都有一个可行的Objective-C库,除非你是从头开始实现自己的。那你就要做很多工作。
在C语言或其他语言中也是如此。语言实现提供了一些核心标准库,为您提供了工作的基础。
有些部分实际上是宏,有些是函数。有些是常见的必需品
答案 2 :(得分:1)
你误解了子类化。
stringWithFormat:
是NSString
上的静态方法(类方法)。您可以在子类中创建其他类的对象(假设您具有必要的导入),但是您不能访问类上的方法,除非它是子类并继承该方法,或者定义方法本身。
e.g。
YourClass *testClass;
[testClass testMethod:@"Test"];
除非testClass
从定义testMethod:
的类继承,或者自己定义它,否则这将失败。
答案 3 :(得分:0)
我是Objective-C编程的完全初学者,事实上我对此感到困惑:
我从理论上读到,子类是继承自其超类的方法而不是相反,所以我只是想如果我能够在一个来自NSObject的子类的类中访问NSString,那就意味着NSObject在访问NSString方法的事实(由于NSString是NSObject的子类,因此不是逻辑)。
最后,我刚才意识到如果我能够访问NSString,那只是因为在我的标题中“包含”了Fundation.h:
#import <Fundation/Fundation.h>