Objective-C不覆盖实现中声明的方法

时间:2013-12-12 08:52:15

标签: objective-c inheritance

我有一个继承自UIViewController的类。此类提供了几个视图控制器需要实现的基本功能,因此它们将从此类继承。我没有用它来直接创建任何实例的原因。

父类和子类都有一个名为setupView的方法,在每个类“viewDidLoad中调用。两个类都有完全相同的方法:

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view.

    [self setupView];
}

setupView未在interface中声明,它只是在implementation中定义,我会阻止任何其他类访问它或覆盖它。但是,当其子项调用父项viewDidLoad并执行[self setupView]时,将调用子项setupView而不是其自己。{/ p>

我有两个问题:

  1. 为什么我的子类覆盖一个未在界面中声明的方法?
  2. 我该如何防止这种情况?
  3. - 编辑 -

    每个setupView方法执行该视图控制器独有的配置。例如,父级使用此方法配置每个子类所需的UIBarButtonItem,并且子级使用它来配置它将使用的表视图。

    我不想在子类中配置UIBarButtonItem,因为那时我必须在每个子节点中执行它,这正是我决定创建父类的原因。我也不想使用[super setupView],因为孩子不应该在父类中了解这个方法。

    能否覆盖未在接口中声明的方法不符合封装原则吗?

    - 应答 -

    可以覆盖Objective-C中的任何方法,包括那些未在interface中声明的方法。这意味着子类中的方法必须具有不同的名称,除非意图覆盖该方法。

3 个答案:

答案 0 :(得分:2)

如果子项实现与父项相同的方法,它基本上会覆盖此方法。然后,您可以使用[super methodName]调用父方法。因此,如果您在孩子中覆盖setupView并且还想要调用父母的setupView,则应该从孩子那里调用它:

- (void)setupView
{
    [super setupView];
    // child code
}

答案 1 :(得分:1)

这是默认方法。孩子会覆盖父母的方法。

我看到两种可能的解决方案:

  • 使用不同的名称
  • 更改孩子的方法如下:

- (void)setupView
{
    if([super respondsToSelector:_cmd])
        [super performSelector:_cmd];
    // child code
}

答案 2 :(得分:0)

您可以做的是检查该类是否为子级别,然后执行您的setupview。但要做到这一点是件坏事。因为你的子类应该从其父类中删除所有内容