У меня есть класс, который наследуется от 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
вызывается вместо его собственного.
Я два вопроса:
- Почему класс I ребенок переопределить метод, который он не объявлен в интерфейсе?
- Как я могу предотвратить это?
--Edit--
Каждый setupView
способ выполнения конфигурации, которые являются исключительными для этого вида контроллера. Например, родитель использует этот метод для настройки UIBarButtonItem
, который требуется каждому дочернему классу, и ребенок использует его для настройки вида таблицы, который он будет использовать.
Я не хочу настраивать UIBarButtonItem
в дочернем классе, потому что тогда мне придется делать это в каждом дочернем элементе, и именно поэтому я решил создать родительский класс. Я также не хочу использовать [super setupView]
, потому что ребенок не должен ничего знать об этом методе в родительском классе.
Возможность переопределить метод, который не объявлен в интерфейсе, не противоречит принципам инкапсуляции?
--Answer--
Любой метод в Objective-C может быть переопределен, в том числе и те, которые не объявлены в interface
. Это означает, что методы в дочерних классах должны иметь разные имена, если только намерение не переопределяет метод.
Кроме того, вы должны удалить дополнительный вызов [self setupView] из viewDidLoad в дочернем. Оставьте эту работу родитель;) –
Проверьте правильность. Я не хочу вызывать '[super setupView]', потому что ребенок не должен знать, что этот метод существует. Я думал, что один из них может переопределить или назвать методы, объявленные только в интерфейсе. Разве это небезопасно, если я буду использовать фреймворк и переопределить частный метод по ошибке? Я не знаю, существует ли этот метод, потому что он не объявлен в интерфейсе. Или это? Разве это не повторяет принципы инкапсуляции? –
В этом случае вы должны использовать другое имя, setupBarButtons или что-то в этом роде. Поскольку переопределение метода будет переопределять его для хорошего в этом классе. –