我有一个继承自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
被调用而不是其自己。
我有两个问题:
- 为什么我子类覆盖它没有在接口中声明的方法?
- 我该如何预防?
- 编辑 -
每个setupView
方法执行与专用于该视图控制器配置。例如,父级使用此方法来配置每个子类所需的UIBarButtonItem
,并且子级使用它来配置它将使用的表视图。
我不想在孩子类中配置UIBarButtonItem
,因为那样我就必须在每个孩子身上这样做,这正是我决定创建父类的原因。我也不想使用[super setupView]
,因为孩子不应该知道父类中的这个方法。
能够覆盖未在接口中声明的方法是否违反封装原则?
--Answer--
在Objective-C的任何方法可以被重写,包括那些没有在interface
声明。这意味着子类中的方法必须具有不同的名称,除非其意图是重写该方法。
此外,你应该从viewDidLoad中删除额外的[self setupView]调用。将该作品留给父母;) –
请检查编辑。 我不想调用''[super setupView]'因为孩子不应该知道这个方法存在。我以为只能在覆盖或调用只在界面中声明的方法。如果我使用框架并且错误地重写私有方法不是不安全的吗?我无法知道该方法是否真的存在,因为它没有在界面中声明。或者,是吗?这不是再次封装的原则吗? –
在这种情况下,您应该使用不同的名称,setupBarButtons或类似的东西。因为重写一个方法会在该类上覆盖它。 –