Объект должен скрывать детали своей реализации, открывая "внешнему миру" лишь методы и свойства. Инкапсуляция (encapsulation) представляет собой доступность свойств и методов объекта," в то время как сам объект фактически скрыт от внешнего мира. Другими словами, объект подобен "черному ящику", т.е. те разработчики, которые с ним работают, могут даже не знать о том, что в действительности происходит внутри данного объекта. Инкапсуляция позволяет разработчикам создавать объекты, которые могут быть из- менены без какого-либо воздействия на использующий их клиентский код. Самое главное в том, что интерфейс (interface) объекта, т.е. набор его доступных свойств и методов, не меняется даже при изменении внутренней реализации объекта. Visual Basic поддерживает инкапсуляцию начиная с версии 4.0. Рассмотрим два простых примера. В листингах 3.5 и 3.6 представлены две реализации класса Person, выполненные двумя различными способами.
ЛИСТИНГ 3.5. Первый способ реализации класса Person
Public Class Person Private m_sFirstName as String Private m_sLastName as String Public Property FirstNamef) as String Get FirstName = m_sFirstName End Get Set(ByVal Value as String) m_sFirstName = Value End Set End Property Public Property LastNameO as String Get LastName = m_sLastName End Get Set(ByVal Value as String) m_sLastName = Value End Set End Property Readonly Property FullNameO as String Get FullName = m_sLastName & ", " & m_sFirstName End Get End Property End Class
Листинг 3.6. Второй способ реализации класса Person
Public Class Person Private m_sFirstName as String Private m_sLastName as String Private m_sFullName as String Public Property FirstName() as String Get FirstName = m_sFirstName End Get Set (ByVal Value as String) m_sFirstName = Value m_sFullName = m_sLastName & ", " S m_sFirstName End~Set End Property Public Property LastNameO as String Get LastName = m_sLastName End Get Set(ByVal Value as String) m_sLastName = Value m_sFullName = m_sLastName & ", " & m_sFirstName End Set End Property Readonly Property FullNameO as String Get FullName = m_sFirstName End Get End Property End Class
Приведенные примеры иллюстрируют инкапсуляцию процессов внутри класса. Несмотря на различия во внутренней реализации классов, внешний интерфейс не изменяется. Именно это и является целью инкапсуляции: позволить разработчику прозрачно использовать различные реализации одного и того же объекта.