Знаете ли вы ООП?

Programming
Предыдущий Следующий

На собеседованиях я не когда не требую глубокого знания теории. Например, ответь мне что такое клиент-серверное приложение? Если человек четко не может дать ответ на этот вопрос, то это не означает что он не программист. Такие вопросы ни дают никакого результата. Я люблю спрашивать по коду, и вопрос всегда один, что в программе происходит?

Это пример с помощью которого человека можно проверить на знания наследования, что будет выведенно на экран:

Этот пример показывает, что наследование очень опасная штука. Программист работает с объектом Animal, а вести он себя может по разному. Рассмотрим объявление класса Fish. Первый и последний метод объявлены одинаково, т.е. если  название метода совпадают с названием класса-отца, то по умолчанию метод будет восприниматься как new. Так действует первый метод, слово new там пропущено, но оно там есть. Второй же метод, переопределяет метод с класса-отца.

 

А теперь, как же действуют программа в этом случае. Когда она видит метод объекта, то она пытается вызвать последнею реализацию этого метода, а слово new означает, как стоп - дальше не ищи, воспользуйся последним найденным методом. Когда мы вызываем objFish.Breathe(), то программа сначала находит метод класса Animal, дальше ищет следующею реализацию этого метода. Переходит к методу класса Fish (про этот класс объект знает, потому что был создан его конструктором), но этот метод объявлен как new (скрыто объявлен) - это означает СТОП, вернись назад. Вот тогда будет выведен Animal::Breathe. Второй метод объявлен как override, что переопределяет метод, значит этот метод является последним вариантом, больше программа методов не находит, и выводит Fish::Eat.  Третий метод действует так как первый.

Ответ:

Animal::Breathe

Fish::Eat

Animal::Sleep

 

Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве Магія зміни: Від ночі до дня
Магія Вечірнього Неба: Відлякуйте втомленість дня і зануртеся у світ загадок і краси