【发布时间】:2013-12-12 08:52:15
【问题描述】:
我有一个继承自 UIViewController 的类。此类提供了几个视图控制器需要实现的基本功能,因此它们将从此类继承。我不使用它直接创建任何实例的原因。
父类和子类都有一个名为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],因为孩子不应该知道父类中的这个方法。
能够覆盖接口中未声明的方法,是否违反封装原则?
--回答--
Objective-C 中的任何方法都可以被覆盖,包括那些没有在interface 中声明的方法。这意味着子类中的方法必须具有不同的名称,除非打算重写该方法。
【问题讨论】: