Является ли инкапсуляция просто созданием капсулы? - PullRequest
0 голосов
/ 25 марта 2019

Недавно я разговаривал с очень опытным программистом (8+ лет опыта), и он сказал мне, что «объединение данных с функциями, которые работают с ними в капсуле» - это неправильный термин для инкапсуляции. Он сказал мне, что это было то, что инкапсуляция позволила мне сделать, но не то, что сама инкапсуляция была. Он сказал мне, что как только наследование невозможно без инкапсуляции, инкапсуляция должна быть просто созданием капсулы (класс или что-то в этом роде). Но сегодня я взял интервью у менее опытного программиста, и он был настолько уверен, что все эти классические определения в википедии были правы, что он сказал мне даже не думать о прохождении интервью. Поэтому я попытался погуглить все эти вещи о инкапсуляции и о том, что наследование невозможно без инкапсуляции, но ничего не нашел. Но я не могу поверить, что опытный программист был неправ, он убедил не только меня, но и других опытных программистов. Может быть, это правильное определение просто что-то, что теряется в кусках бесполезной и неважной информации?

Поэтому, пожалуйста, дайте мне ответы на эти два вопроса:

1) возможно ли наследование без инкапсуляции? (Наследование класса от класса)

2) Если нет, то можем ли мы объявить инкапсуляцию класса? Потому что только после объявления класса мы можем наследовать.

1 Ответ

1 голос
/ 26 марта 2019

Извините, но я не вижу связи между инкапсуляцией и наследованием.

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

Наследование в мире ООП - это способность извлекать конкретный объект и извлекать из него еще более конкретный объект, добавляя при этом возможности (и иногда изменяя существующие возможности посредством переопределения).
Например: A Dog является разновидностью Mammal, которая является разновидностью Animal.
Animal может содержать такие методы, как Eat() и такие свойства, как Weight и Age.
Mammal может переопределить метод Eat() для осуществления сосания грудью (из материнской груди) в младенчестве, но в зависимости от его возраста есть твердую пищу.
Dog может вводить другую возможность, такую ​​как Bark.
Все это не имеет ничего общего с инкапсуляцией, как описано в предыдущем абзаце.

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

Однако , сегодня я впервые вижу другое определение инкапсуляции (и я работаю с oop-языками уже около двух десятилетий):

Языковая конструкция, которая облегчает связывание данных с методами (или другими функциями), работающими с этими данными.

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

...