Основные понятия в ООП - PullRequest
       33

Основные понятия в ООП

24 голосов
/ 31 декабря 2008

Меня однажды спросили в интервью: «Каковы 3 основных понятия ООП?». Я ответил, сказав, что, по моему мнению, их было 4:

  • Наследование
  • Инкапсуляция
  • Абстракция
  • Полиморфизм

Был ли я прав?

Ответы [ 14 ]

48 голосов
/ 31 декабря 2008

Есть 3 требования к языку, чтобы быть объектно-ориентированным:

  • язык, который поддерживает только инкапсуляцию (объекты), не является объектно-ориентированным, но он модульный
  • язык, который поддерживает только инкапсуляцию (объекты) и передачу сообщений (полиморфизм), не является объектно-ориентированным, но он основан на объектах
  • язык, который поддерживает инкапсуляцию (объекты), передачу сообщений (полиморфизм) и наследование (абстракция), является объектно-ориентированным

ПРИМЕЧАНИЕ: Абстракция - гораздо более общая концепция; инкапсуляция и др. являются видами абстракций, так же как подпрограмма является своего рода абстракцией. См Абстракция

12 голосов
/ 31 декабря 2008

Я бы сказал, что абстракция - это не только концепция ООП, так как вы можете в значительной степени абстрагироваться во многих не-ООП языках.

6 голосов
/ 22 марта 2011

Четыре столпа как ваше правильное состояние

  • Инкапсуляция.
  • Абстракция
  • Наследование
  • Полиморфизм

Инкапсуляция касается хранения данных, ни больше, ни меньше.

Абстракция имеет дело с абстракцией данных, т. Е. Действительно ли все эти данные актуальны. Подумайте о банке, который содержит информацию об имени, возрасте, адресе, цвете глаз, любимом галстуке и т. Д. Действительно ли цвет глаз и любимый галстук действительно соответствуют требованиям банков? Это абстракция.

Наследование имеет дело с обобщением. Информация, которая может относиться более чем к одной вещи. Если что-то наследует от чего-то, то можно сказать, что это более специфический тип этой вещи. Например, Животное. Собака - это тип Животного, поэтому Собака наследует от Животного. Джек Рассел - тип собаки, поэтому Джек Рассел наследует от собаки.

Полиморфизм имеет дело с вещами, имеющими многократные формы (полиморфизм). Два вида в программировании,

  • Позднее связывание,
  • Вы ссылаетесь на что-то как на общий тип, и, следовательно, компилятор не знает, что связывать во время компиляции. Подумайте, метод Overriding.

  • Раннее связывание

  • Вы переопределяете метод, используя другую сигнатуру, т.е. int add(int a, int b) vs double add(double a, double b)

Это, по сути, основные принципы объектной ориентации. Между ними много общего, поэтому очень важно добиться четкого понимания того, что означает каждый из них.

4 голосов
/ 31 декабря 2008

Проблема с ООП состоит в том, что никто не удосужился дать правильное , краткое, согласованное определение. Особенно хочу отметить, что все упомянутые вами аспекты вполне могут быть реализованы без использования объектной ориентации!

Двумя типами систем, которые делают это, является система типов Haskell, которая, по общему мнению, обычно не считается объектно-ориентированной, и шаблоны C ++ с подклассами шаблонов. Однако, возможно, можно утверждать, что подклассы шаблонов эмулируют ООП.

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

String<Char> cstr = "This is a test";
String<Dna, Packed<> > dstr = "GATTACA";

cout << "length(" << cstr << ") = " << length(cstr) << endl;
cout << "length(" << dstr << ") = " << length(dstr) << endl;

Здесь String<Char> и String<Dna, Packed<> > являются унаследованными от " abstract class" String<>. Они инкапсулируют концепцию строки, используя совершенно разные методы. Они разделяют полиморфный length метод, реализованный по-разному для обоих конкретных типов.

4 голосов
/ 31 декабря 2008

Это Четыре Всадника, как я их знаю. Может быть, они по ошибке смешивают наследование и полиморфизм вместе.

3 голосов
/ 31 декабря 2008

Да, это стандартные четыре.

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

2 голосов
/ 31 декабря 2008

Большинство людей сочли бы это правильным, я думаю, если бы они просили три, это было бы Наследование, Инкапсуляция и Полиморфизм.

Лично я считаю, что эти три понятия являются настоящим «мясом», если вы будете придерживаться определения ООП. И большинство людей воспринимает абстракцию как должное и смешивает ее с остальными, поскольку на самом деле ее можно считать частью любой из трех других.

Когда я говорю об ООП, я всегда упоминаю 4.

0 голосов
/ 29 сентября 2011

Обычно считается, что это основные принципы, однако они имеют мало общего с тем, почему был создан ОО.

Одним из руководящих принципов была метафора прямого манипулирования. Это создание объекта в программе, который представляет объект из ментальной модели пользователя. Большая часть мотивации для создания ОО была основана на психологии, а не на математике / КС, как часто полагают в наши дни.

Если сомневаетесь, взгляните на некоторые работы Трюгве Ренскауге. Отец MVC и DCI или Джеймс Коплиен являются автором и докладчиком.

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

0 голосов
/ 31 декабря 2008

Правильный ответ на вопрос: «Пожалуйста, уточните, что вы подразумеваете под объектно-ориентированным программированием». К сожалению, это было бы интересно, потому что реальный вопрос, который задают: «Когда я говорю ООП, что я имею в виду?»

Нет правильного ответа.

0 голосов
/ 31 декабря 2008

Возможно, это был сложный вопрос для интервью, но в наши дни на уроках информатики они преподают 4 столпа объектно-ориентированного программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...