Что такое класс-обёртка? - PullRequest
209 голосов
/ 20 мая 2009

Что такое класс-обёртка?
Чем полезны такие занятия?

Ответы [ 17 ]

164 голосов
/ 20 мая 2009

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

67 голосов
/ 20 мая 2009

Как это звучит: класс, который «оборачивает» функциональность другого класса или API в более простой или просто другой API.

См .: Схема адаптера , Схема фасада

40 голосов
/ 02 июля 2012

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

int Integer
byte Byte 

Integer и Byte - это классы-обёртки примитивов int и byte. Существуют времена / ограничения, когда вам нужно использовать примитивы в качестве объектов, поэтому классы-оболочки предоставляют механизм, называемый боксом / распаковкой.

Понятие может быть хорошо понято на следующем примере как

double d = 135.0 d;
Double doubleWrapper = new Double(d);

int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();

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

double d = 135.0;
int integerValue = (int) d ;

Хотя double значение явно преобразуется в целочисленное значение, также называемое понижением.

17 голосов
/ 20 мая 2009

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

Например, было бы очень полезно создать класс-оболочку dll, который позаботится обо всей инициализации и очистке dll, а также создать методы класса, которые переносят указатели функций, созданные, например, из GetProcAddress().

Ура!

8 голосов
/ 20 мая 2009

Существует несколько шаблонов проектирования, которые можно назвать классами-обертками.

См. Мой ответ на вопрос " Чем отличаются шаблоны прокси, декоратора, адаптера и моста? "

8 голосов
/ 20 мая 2009

Класс-обертка - это класс, который "оборачивает" что-то еще, как и его имя.

Более формальным определением этого класса будет класс, реализующий Pattern Adapter . Это позволяет вам модифицировать один набор API в более удобную для чтения форму. Например, в C #, если вы хотите использовать собственный API-интерфейс Windows, это помогает обернуть его в класс, соответствующий рекомендациям по разработке .NET.

7 голосов
/ 09 сентября 2011

Класс Wrapper - это класс, который оборачивает другой класс и обеспечивает абстракцию между клиентом и исходным классом, обертываемым.

7 голосов
/ 20 мая 2009

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

EDIT:

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

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

5 голосов
/ 20 мая 2009

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

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

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

3 голосов
/ 20 мая 2009

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

...