我有一个继承自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>
我有两个问题:
- 编辑 -
每个setupView
方法执行该视图控制器独有的配置。例如,父级使用此方法配置每个子类所需的UIBarButtonItem
,并且子级使用它来配置它将使用的表视图。
我不想在子类中配置UIBarButtonItem
,因为那时我必须在每个子节点中执行它,这正是我决定创建父类的原因。我也不想使用[super setupView]
,因为孩子不应该在父类中了解这个方法。
能否覆盖未在接口中声明的方法不符合封装原则吗?
- 应答 -
可以覆盖Objective-C中的任何方法,包括那些未在interface
中声明的方法。这意味着子类中的方法必须具有不同的名称,除非意图覆盖该方法。
答案 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。但要做到这一点是件坏事。因为你的子类应该从其父类中删除所有内容