#c# #oop
#c# #ооп
Вопрос:
Я знаю, что инкапсуляция означает что-то вроде того, что один объект не должен иметь прямого доступа к элементам разных объектов … но я предполагаю, что это относится к общедоступным полям? Я предполагаю, что общедоступные методы не нарушают инкапсуляцию ..? Я просто не совсем понимаю здесь и был бы рад любому объяснению.
Ответ №1:
Инкапсуляция — это то, по чему вы водите свою машину:
- поворот ключа зажигания
- управление рулем
- переключение передач (если не автоматическое)
- добавление топлива
и не по:
- воспламенение топлива в цилиндрах
- трение шин и грунта
- и так далее…
Раскрыть (создать public
) ЧТО и скрыть (создать private
) КАК. Теперь вы инкапсулируете.
🙂
Ответ №2:
Инкапсуляция не означает, что не должно быть никакого доступа к элементам. Это означает, что вы должны разрешать доступ только к элементам, которые должны использоваться, в основном ограниченный доступ вместо отсутствия доступа.
Делая что-то общедоступным, вы разрешаете доступ, делая это приватным — нет.
В этой статье рассматривается более подробно, а также различные модификаторы доступа:
http://www.csharp-station.com/Tutorials/lesson19.aspx
В этой статье они приводят хороший пример:
using System;
class BankAccountProtected
{
public void CloseAccount()
{
ApplyPenalties();
CalculateFinalInterest();
DeleteAccountFromDB();
}
protected virtual void ApplyPenalties()
{
// deduct from account
}
protected virtual void CalculateFinalInterest()
{
// add to account
}
protected virtual void DeleteAccountFromDB()
{
// send notification to data entry personnel
}
}
Когда программист хочет закрыть учетную запись, ему не нужно беспокоиться о различных шагах, которые выполняются для этого:
- Применяемые права
- ВычислитьFinalInterest
- Удалить ACCOUNTFROMDB
Они должны просто сказать, что хотят, чтобы это было закрыто, и что все необходимые шаги будут предприняты. Вот почему CloseAccount
является общедоступным, а другие нет.
Ответ №3:
Я нахожу наиболее полезным думать о классах, таких как люди с разными заданиями. Например, если я менеджер проекта, а вы разработчик, мой публичный контракт с вами заключается в том, что я буду назначать вам задачи. Как мне определить приоритет? Это деталь, которая является частной для меня; вам как разработчику не нужно знать это, чтобы выполнять свою работу.
Итак, когда вы думаете об инкапсуляции, разделите знания класса на его публичный контракт и детали его реализации. Первое должно быть открыто — будь то через общедоступные свойства, методы или что-то еще — а второе должно быть инкапсулировано внутри класса, чтобы посторонний не мог об этом узнать.
Комментарии:
1. Тьфу, вы (менеджер) предоставляете свои методы разработчику… Разве не наоборот, что все должно работать? 🙂
Ответ №4:
Инкапсуляция скрывает детали реализации объекта, чтобы не было внешних зависимостей от конкретной реализации. взято из блога msdn.
Взгляните на этот пост CodeProject.