+7 (499) 322-30-47  Москва

+7 (812) 385-59-71  Санкт-Петербург

8 (800) 222-34-18  Остальные регионы

Бесплатная консультация с юристом!

Зачем нужно наследование в ооп 2019 год

13 августа 2010 в 20:55

Наследование и ООП

В сегодняшнем уроке мы будем говорить о наследовании. Лучше всего наследование изучать на конкретных примерах.

Итак, наследование. Данный вид взаимоотношения классов применяется в разных ситуациях.

Начнём с примера:

Здесь у нас определён класс infantry (пехота). В классе два поля: health (здоровье) и damage (урон противнику). Переменная-член health расположена в блоке private. Доступ к данному полю возможен только через функции set_health() и get_health(). Для damage тоже нужно использовать похожие функции, но для сокращения кода я просто объявил damage в блоке public.

Кроме того я добавил два конструктора: по умолчанию и с двумя аргументами.

С помощью наследования можно исправить или улучшить существующий класс.

Допустим, мы пишем игру уже довольно давно: несколько дней или даже несколько месяцев. И на каком-то этапе понадобилось включить пехотинцев с гранатами. Причём кроме гранат, данный вид пехотинцев полностью похож на объекты класса infantry. К тому же, обычно ситуация усугубляется ещё и тем, что в классе не два поля и две функции, а с десяток и того и другого.

Единственное изменение, которое нам необходимо сделать в классе infantry: ключевое слово private заменить на protected:

Теперь создаём новый класс:

Поле grenades я объявил в блоке public, чтобы не писать функции доступа.

Данный класс обладает всеми свойствами класса infantry и вдобавок у него есть поле grenades. При этом класс infantry — базовый класс, а класс grenadier — производный.

В заголовке класса grenadier после двоеточия стоит ключевое слово public и имя базового класса infantry. public задаёт общее наследование. Существует ещё частное (private), но мы пока не будем обсуждать такие тонкости.
Спецификатор доступа protected

Спецификаторы доступа public (общий) и private (частный) мы обсуждали при изучении классов. Существует ещё один спецификатор доступа — protected (защищённый).

Спецификатор доступа protected аналогичен private, только он позволяет получить доступ к защищённым данным из производного класса. Когда в программе вы будете применять наследование, то вместо спецификатора private всегда используйте protected.

С помощью наследования удобно строить иерархию классов. При этом более общие и абстрактные классы — базовые, а более специализированные — производные.

Пусть общим классом у нас будет — солдат. В данном классе можно задать только движение. Затем можно создать более специализированные классы, обладающие конкретными свойствами: стрелок, снайпер, пулемётчик. При этом для производных классов уже не надо писать функции движения, они их унаследуют от базового.
Множественное наследование

Для пояснения данной темы нам понадобится ещё один класс

Здесь объявлен класс lorry (грузовик) с одним полем fuel (топливо) и двумя конструкторами.

Объединив два класса infantry и lorry, мы можем получить новый класс:

В класс mech_inf (mechanized infantry — мотопехота) мы не добавили ничего нового. Мы просто в заголовке класса mech_inf указали, что он является производным от двух других классов: infantry и lorry. В классе объявляются только два конструктора. Обратите внимание, что в списке инициализации конструктора mech_inf мы вызываем конструкторы infantry() и lorry().

Теперь можно создать объект нового класса.

mech_inf division_1(100, 20, 100);

При этом он обладает свойствами двух базовых классов:

division_1.damage = 10; // damage — член класса infantry
division_1.fuel = 200; // fuel — член класса lorry

Напоследок давайте рассмотрим ещё одну ситуацию. Допустим в классах infantry и lorry есть метод с одним и тем же именем и одними и теми же аргументами. Пусть метод называется move() и в нашем примере у него не будет аргументов.

Это интересно:  Наследование по закону и по завещанию 2019 год

division_1.move(); // объект класса mech_inf

В данном примере объект не знает, какой из методов вызывать: принадлежащий классу infantry или классу lorry. Чтобы разрешить данную проблему необходимо использовать операцию глобального разрешения:

Здесь мы вызываем метод move() объявленный в классе infantry.

Данный случай на первый взгляд не слишком важен. На самом деле, из ситуации, когда у нескольких классов определены методы с одним именем, можно извлечь колоссальную выгоду. Данной теме будет посвящён отдельный урок.

На сегодня всё. Упражнений не будет. Но у вас уже достаточно знаний чтобы на основе pseudo_game сделать что-нибудь интересное и одновременно применить знания, полученные при чтении данного урока.

Наследование классов в C++: что это и как он работает

Всем привет! Продолжаем изучать классы в C++. Сейчас поговорим об одном из свойств объектно ориентированного программирования — наследование.

Что такое наследование

Это принцип создание класса на базе уже существующего, при этом у нас есть возможность пользоваться функционалом (свойствами и методами) базового. Классы созданные таким образом называются производными или дочерними, а на базе которого создаются — родителем или базовым.

Этот механизм в объектно ориентированном программировании очень сильная фича. Она в несколько раз экономит время на создание проекта, а также не нагружает его повторяющимся кодом.

Производный класс мы можем усовершенствовать, добавляя:

И все это не изменяя базовый класс.

Например, на базе класса про животного можно создать потомка про собаку.

Модификатор доступа protected

Для начала нужно знать об доступе protected, который является неотъемлемой частью наследования. protected — это модификатор доступа, который работает как private, но распространяется также на свойства предка. На рисунки ниже можно увидеть какими доступами можно пользоваться.

Языки программирования

Лекция. ООП. Наследование классов

Наследование является мощнейшим инструментом ООП. Оно позволяет строить иерархии, в которых классы-потомки получают свойства классов-предков и могут дополнять их или изменять. Наследование применяется для следующих взаимосвязанных целей: исключения из программы повторяющихся фрагментов кода; упрощения модификации программы; упрощения создания новых программ на основе существующих. Кроме того, наследование является единственной возможностью использовать классы, исходный код которых недоступен, но которые требуется использовать с изменениями.

Класс в C# может иметь произвольное количество потомков и только одного предка. При описании класса имя его предка записывается в заголовке класса после двоеточия. Если имя предка не указано, предком считается базовый класс всей иерархии System.Object:

[ атрибуты ] [ спецификаторы ] class имя_класса [ : предки ] тело класса

особенности: — класс в C# может иметь произвольное количество потомков
— класс можно наследовать только от одного класса-предка и от произвольного количества интерфейсов
— при наследовании потомок получает все элементы предка
— элементы private не доступны потомку непосредственно
— элементы protected доступны только потомкам.

Базовый класс обеспечивает для производных классов:
— Элементы, которые потомки могут использовать непосредственно
— Функции, которые должны быть реализованы после их переопределения

Абстрактный класс (abstract)– показывает, что класс фиктивный и имеет пустое тело; конкретное значение присваивается в производных классах. Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производных классах. Закрытые классы и методы (sealed) – от такого класса нельзя ничего наследовать, а метод нельзя переопределить. Наследование, вместе с инкапсуляцией и полиморфизмом, является одной из трех основных характеристик (или базовых понятий) объектно-ориентированного программирования. Наследование позволяет создавать новые классы, которые повторно используют, расширяют и изменяют поведение, определенное в других классах. Класс, члены которого наследуются, называется базовым классом, а класс, который наследует эти члены, называется производным классом. Производный класс может иметь только один непосредственный базовый класс. Однако наследование является транзитивным. Если ClassC является производным от ClassB, и ClassB является производным от ClassA, ClassC наследует члены, объявленные в ClassB и ClassA. C++:язык, поддерживающий множественное наследование

Собеседование по Java — ООП (вопросы и ответы). Часть 1.

Вопросы и ответы по теме ООП (объектно ориентированное программирование) для собеседования по Java.

К списку вопросов по всем темам

Список всех вопросов по ООП

1. Назовите принципы ООП и расскажите о каждом.
2. Дайте определение понятию “класс”.
3. Что такое поле/атрибут класса?
4. Как правильно организовать доступ к полям класса?
5. Дайте определение понятию “конструктор”.
6. Чем отличаются конструкторы по-умолчанию, копирования и конструктор с параметрами?
7. Какие модификации уровня доступа вы знаете, расскажите про каждый из них.
8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
9. О чем говорят ключевые слова “this”, “super”, где и как их можно использовать?
10. Дайте определение понятию “метод”.
11. Что такое сигнатура метода?
12. Какие методы называются перегруженными?
13. Могут ли нестатические методы перегрузить статические?
14. Расскажите про переопределение методов.
15. Может ли метод принимать разное количество параметров (аргументы переменной длины)?
16. Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
17. Как получить доступ к переопределенным методам родительского класса?
18. Какие преобразования называются нисходящими и восходящими?
19. Чем отличается переопределение от перегрузки?
20. Где можно инициализировать статические/нестатические поля?

21. Зачем нужен оператор instanceof?
22. Зачем нужны и какие бывают блоки инициализации?
23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
24. Где и для чего используется модификатор abstract?
25. Можно ли объявить метод абстрактным и статическим одновременно?
26. Что означает ключевое слово static?
27. К каким конструкциям Java применим модификатор static?
28. Что будет, если в static блоке кода возникнет исключительная ситуация?
29. Можно ли перегрузить static метод?
30. Что такое статический класс, какие особенности его использования?
31. Какие особенности инициализации final static переменных?
32. Как влияет модификатор static на класс/метод/поле?
33. О чем говорит ключевое слово final?
34. Дайте определение понятию “интерфейс”.
35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
36. Почему нельзя объявить метод интерфейса с модификатором final или static?
37. Какие типы классов бывают в java (вложенные… и.т.д.)
38. Какие особенности создания вложенных классов: простых и статических.
39. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
40. В чем разница вложенных и внутренних классов?
41. Какие классы называются анонимными?
42. Каким образом из вложенного класса получить доступ к полю внешнего класса?

43. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
44. Как связан любой пользовательский класс с классом Object?
45. Расскажите про каждый из методов класса Object.
46. Что такое метод equals(). Чем он отличается от операции ==.
47. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
48. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
49. В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?
50. Какой метод возвращает строковое представление объекта?
51. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
52. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
53. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
54. Чем отличается абстрактный класс от интерфейса, в каких случаях что вы будете использовать?
55. Можно ли получить доступ к private переменным класса и если да, то каким образом?
56. Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?
57. Расширение модификаторов при наследовании, переопределение и сокрытие методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
58. Имеет ли смысл объявлять метод private final?
59. Какие особенности инициализации final переменных?
60. Что будет, если единственный конструктор класса объявлен как final?
61. Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.
62. Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?

Ответы. Часть 1

1. Назовите принципы ООП и расскажите о каждом.

Объе́ктно-ориенти́рованное программи́рование (ООП) — это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Основные принципы ООП: абстракция, инкапсуляция, наследование, полиморфизм.

Абстракция — означает выделение значимой информации и исключение из рассмотрения незначимой. С точки зрения программирования это правильное разделение программы на объекты. Абстракция позволяет отобрать главные характеристики и опустить второстепенные.

Пример: описание должностей в компании. Здесь название должности значимая информация, а описание обязанностей у каждой должности это второстепенная информация. К примеру главной характеристикой для «директор» будет то, что это должность чем-то управляет, а чем именно (директор по персоналу, финансовый директор, исполнительный директор) это уже второстепенная информация.

Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Для Java корректно будет говорить, что инкапсуляция это «сокрытие реализации». Пример из жизни — пульт от телевизора. Мы нажимаем кнопочку «увеличить громкость» и она увеличивается, но в этот момент происходят десятки процессов, которые скрыты от нас. Для Java: можно создать класс с 10 методами, например вычисляющие площадь сложной фигуры, но сделать из них 9 private. 10й метод будет называться «вычислитьПлощадь()» и объявлен public, а в нем уже будут вызываться необходимые скрытые от пользователя методы. Именно его и будет вызывать пользователь.

Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником, дочерним или производным классом.

Полиморфизм — свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Пример (чуть переделанный) из Thinking in Java:

Статья написана по материалам сайтов: codelessons.ru, moodle.kstu.ru, javastudy.ru.

»

Помогла статья? Оцените её
1 Star2 Stars3 Stars4 Stars5 Stars
Загрузка...
Добавить комментарий

Adblock detector