Objective C类扩展方法

时间:2015-05-21 16:52:18

标签: ios objective-c categories

据我所知,类扩展用于在目标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()方法,并观察到调用了基类方法。 有人可以解释一下吗?

4 个答案:

答案 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

的原因