据我所知,类扩展用于在目标C中声明私有方法。但我发现这种情况正在发生。
// Person.m
import numpy as np
def split_into_quadrants(points, idx=0):
if idx < points.shape[-1]:
positive = points[points[:, idx] >= 0]
negative = points[points[:, idx] < 0]
return (split_into_quadrants(positive, idx+1) +
split_into_quadrants(negative, idx+1))
else:
return [points]
b = np.round(np.random.random((30,3))*20)
b = b - b.mean(axis=0)
print(split_into_quadrants(b))
如果我将其子类化并在子类的.h文件中声明相同的函数。 //SubPerson.h
@interface Person()
- (void)someMethod;
@end
@implementation
- (void)someMethod
{
NSLog(@"base class method");
}
我没有在.m文件(SubPerson.m)
中提供此方法的定义 然后我创建了一个派生类实例并在某个文件中调用someMethod()方法,并观察到调用了基类方法。 有人可以解释一下吗?答案 0 :(得分:4)
可见性仅供编译器使用。 Objective-C运行时本身不会阻止您调用私有方法。 Objective-C方法不具有公共,私有和受保护的概念,例如Java;有效地,所有方法都是公共的#34; (至少在Java意义上)。
答案 1 :(得分:0)
在Objective-C中,您放置方法headers / @ interface blocks定义方法的可见性。由于超类具有someMethod
作为私有,但子类将其作为公共子类,因此子类有效地将方法标头作为私有和公共,因此公共可见性优先,因为它是唯一允许私有的可见性级别和公众可见性定义。
答案 2 :(得分:0)
这称为继承,它是面向对象编程的概念。您只是在这里使子类可见超类方法。
如果您覆盖此方法并且它是一个公共方法,除非您在[super someMethod]
subPerson
{{{}}内调用someMethod
,否则它不会调用超类。 1}}实施。
答案 3 :(得分:0)
我在这里看不出任何错误,你在person类中将someMethod()定义为public,而Person类是SubPerson类的子类。所以SubPerson类应该包含所有公共属性和方法。这就是为什么你可以从SubPerson类调用someMethod
的原因