2013-12-12 32 views
0

我有一个继承自UIViewController的类。这个类提供了几个视图控制器需要实现的基本特性,所以它们将继承这个类。我不使用它来直接创建任何实例的原因。Objective-C不覆盖在实现中声明的方法

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

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

    [self setupView]; 
} 

setupView未在interface宣布,它只是在implementation定义,我虽然会阻止任何其他类来访问它或将其覆盖。然而,当父母的viewDidLoad被其子女调用并且[self setupView]被执行时,子女的setupView被调用而不是其自己。

我有两个问题:

  1. 为什么我子类覆盖它没有在接口中声明的方法?
  2. 我该如何预防?

- 编辑 -

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

我不想在孩子类中配置UIBarButtonItem,因为那样我就必须在每个孩子身上这样做,这正是我决定创建父类的原因。我也不想使用[super setupView],因为孩子不应该知道父类中的这个方法。

能够覆盖未在接口中声明的方法是否违反封装原则?

--Answer--

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

回答

2

如果孩子实现与父母相同的方法,它基本上会覆盖此方法。然后您可以使用[super methodName]调用父方法。

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

此外,你应该从viewDidLoad中删除额外的[self setupView]调用。将该作品留给父母;) –

+0

请检查编辑。 我不想调用''[super setupView]'因为孩子不应该知道这个方法存在。我以为只能在覆盖或调用只在界面中声明的方法。如果我使用框架并且错误地重写私有方法不是不安全的吗?我无法知道该方法是否真的存在,因为它没有在界面中声明。或者,是吗?这不是再次封装的原则吗? –

+1

在这种情况下,您应该使用不同的名称,setupBarButtons或类似的东西。因为重写一个方法会在该类上覆盖它。 –

0

你可以做的是检查类是sublcass与否:所以,如果你是覆盖在孩子setupView,也希望有父母的setupView叫,你应该从孩子叫它然后执行你的setupview。但这是一件坏事。因为你的子类应该从父母那里汲取所有东西

1

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

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

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

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

我认为只有'interface'中声明的方法可以被覆盖。能做到这一点并不违背封装原则? –

+0

编号所有方法。这是目标C –

+0

中的多态性这不是不安全吗?例如,如果我正在使用库,我无法知道'implementation'中使用了哪些方法,我只知道'interface'中声明的方法。这意味着我有可能重写一个我甚至不知道它存在的方法吗? –