2011-01-23 2 views
0

У меня проблема с концепцией и внедрением инкапсуляции.Концепция инкапсуляции

Может кто-нибудь объяснить это мне?

+0

Какая у вас проблема? – Sarfraz

+0

У вас есть вопрос или проблема? –

+0

В чем проблема? Можете ли вы привести пример того, что вы не понимаете? –

ответ

10

Инкапсуляция - это умеренно простая концепция, как только вы ее осознаете (возможно) происходит от того же базового слова, что и капсула.

Это просто сдерживание информации.

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

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

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

В качестве примера, вот класс для сохранения целых списков в моей мифической, но странно Pythonic и поэтому мы надеемся, легко понять, язык:

class intlist: 
    private int val[10] 
    private bool used[10] 
    public constructor: 
     for i in 0..9: 
      used[i] = false 

    public function add (int v): 
     for i in 0..9: 
      if not used[i]: 
       used[i] = true 
       val[i] = v 
       return 
     throw intlist-full 

    public function del (int v): 
     for i in 0..9: 
      if used[i] and val[i] == v: 
       used[i] = false 
       return 
     throw intlist-invalid-value 

Теперь информация только опубликованы здесь конструктор и две функции для добавления и удаления.

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

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


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

На самом деле, на этом хороший пример . У вас нет care что на самом деле стоит за указателем, так как все функции, которые его используют, знают, как делать свой материал.

+1

, пожалуйста Примите пример – mehdi1564

+0

Хорошо, я добавил довольно надуманный пример, но он должен, надеюсь, проиллюстрировать то, что я имел в виду. – paxdiablo

7

link text

Я всегда объяснить это людям, это думать о себе как объект. Другие люди могут видеть ваш рост, они могут видеть, улыбаются ли вы, но ваши внутренние мысли, может быть, причина, когда вы улыбаетесь, только вы знаете.

2

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

скрыть/связать что-то: например, капсула (которую мы потребляем, когда v r ill) скрывает/связывает некоторую порошковую форму сама по себе, означает, что капсула инкапсулирует порошок, содержащий ее.

Связывание данных и их поведение Функциональность объекта в надежном и контролируемом режиме.

или лучший пример инкапсуляции является классом, потому что класс скрывает класс переменные/функцию из вне класса D ..

Инкапсуляции: подведению член данных и способ вместе в единое целое (т.е. класса) называемой инкапсуляцией.

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

Это метод, используемый для защиты информации об объекте от других объектов. Подобно переменной, мы можем установить как private, так и свойство public. Когда мы получаем доступ к свойству, мы проверяем его и устанавливаем.

Мы можем ознакомиться с некоторыми другими примерами. Наш ноутбук. Мы можем использовать ноутбук, но какие операции происходят внутри, что мы не знаем. Но мы можем это использовать. Аналогично мобильному, ТВ и т. Д.

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

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

// Объявить как Private

private string _LegName; 

// Установка свойства как общественное

public string LegName 
{ 
    get 
    { 
    return _LegName; 
    } 
    set 
    { 
    _LegName=value; 
    } 

public class LegMain 
{ 
    public static int Main(string[] args) 
    { 
    Leg L= new Leg(); 
    d.LegName="Right Leg"; 
    Console.WriteLine("The Legis :{0}",d.LegName);return 0; 
    } 
    } 

Примечание: Инкапсуляция обеспечивает способ защиты данных от случайного повреждения.

Спасибо

1

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

Красота инкапсуляции - это сила изменения вещей, не затрагивая ее пользователей.

На объектно-ориентированном языке программирования, таком как Java, вы достигаете инкапсуляции, скрывая детали с помощью модификаторов доступности (public, protected, private, plus no modifier, что подразумевает закрытие пакета). С этими уровнями доступности вы контролируете уровень инкапсуляции, тем менее ограничительным является уровень, более дорогое изменение происходит, когда это происходит, и чем больше класс связан с другими зависимыми классами (например, пользовательскими классами, подклассами).

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

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

Существует несколько причин, по которым вы можете инкапсулировать доступ к своим полям. Джошуа Блох в своей книге «Эффективная Ява» в пункте 14: Минимизируйте доступность классов и членов, упоминает несколько веских причин, которые я цитирую здесь:

Вы можете ограничить значения, которые могут быть сохранены в поле (т.е. F или M). Вы можете выполнять действия при изменении поля (событие триггера, проверка и т. Д.). Вы можете обеспечить безопасность потоков путем синхронизации метода. Вы можете переключиться на новое представление данных (т. Е. Вычисленные поля, разные типы данных) Однако инкапсуляция - это больше, чем скрытие полей. В Java вы можете скрыть целые классы, тем самым скрывая детали реализации всего API. Подумайте, например, в методе Arrays.asList(). Он возвращает реализацию List, но вы не заботитесь о том, какая реализация, если она удовлетворяет интерфейсу List, правильно ?. Реализация может быть изменена в будущем, не затрагивая пользователей метода.

Красота Encapsulation

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

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

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

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

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

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

Я действительно рекомендую вам прочитать статью Алана Снайдера под названием «Инкапсуляция и наследование» в объектно-ориентированных языках программирования. Эта ссылка указывает на оригинальную бумагу ACM, но я уверен, что вы сможете найти копию PDF через Google.

Смежные вопросы