Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 131

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 341 >> Следующая


В программе TIMES2 класс timel2 объединен с классом time24, потому что мы преобразовываем объекты одного класса в объекты другого.

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

В программе TIMESl объект tl2 класса timel2 вызывает функцию преобразования timel2() объекта t24 из класса time24. Это происходит в функции main() в строке

timel2 tl2 = t24:

Этот вызов отражен на диаграмме линией, связывающей два класса.

Направленность

На диаграмме мы можем нарисовать незакрашенную стрелку, показывающую направленность объединения (как мы увидим позже, закрашенная стрелка имеет другое значение). Так как класс timel2 вызывает класс time24, то стрелка будет показывать в направлении от класса timel2 к классу time24. Мы назовем это объединение однонаправленным, так как действие происходит в одном направлении. Если каждый из двух классов вызывает операции другого класса, то такое объединение будет называться двунаправленным и будет обозначаться стрелками на обоих концах линии, соединяющей классы. Стрелки, обозначающие направленность, не являются обязательными, как и многие другие вещи в UML. 348

Глава 8. Перегрузка операций

«Подводные камни» перегрузки операций и преобразования типов

Перегрузка операций и преобразование типов дают нам возможность создать, в сущности, новый язык. Пусть a, b и с — объекты определенного пользователем класса, а операция + перегружена, при этом строка

a = b + с:

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

Использование похожих значений

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

Перегрузка операции предполагает, что это имеет смысл для выполнения определенных действий с объектами определенного класса. Если мы собираемся перегрузить операцию + класса X, то результат сложения двух объектов класса X должен иметь значение, по крайней мере, похожее на сумму. Например, в этой главе мы показывали, как перегрузить операцию + для класса Distance. Сложение двух интервалов несомненно имеет смысл. Мы также перегружали операцию + для класса String. Здесь мы интерпретировали сложение двух строк как добавление одной строки в конец другой для формирования третьей. Этот случай также удовлетворяет нашим требованиям. Но для многих классов, возможно, просто не будет причины говорить о «складывании» их объектов. Так, нам не нужно сложение для объектов класса employee, содержащих информацию о служащем.

Использование похожего синтаксиса

Используйте перегруженные операции так же, как и основные. Например, если alpha и beta основного типа, то операция присваивания в выражении

alpha += beta;

присваивает alpha сумму alpha и beta. Любая перегруженная версия этой операции должна выполнять что-либо подобное. Она, возможно, должна делать то же, что и

alpha - alpha + beta: где + перегружен.

Если вы перегружаете одну арифметическую операцию, то вы можете для целостности перегрузить их все. Это предотвратит путаницу. Ключевые слова explicit и mutable

349

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

Показывайте ограничение

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

a = b + с;

в действительности означает. Если у вас очень много перегруженных операций, и они используются для не понятных интуитивно целей, то потеряется суть их использования и чтение листинга станет тяжелее вместо того, чтобы стать легче. Используйте перегрузку операций очень аккуратно, только там, где необходимость ее использования очевидна. Вас могут одолеть сомнения, использовать ли функцию взамен перегруженной операции, так как имя функции однозначно. Если вы, скажем, напишете функцию для поиска левой стороны строки, то вам будет лучше вызвать функцию getleft(), чем пытаться перегрузить операцию (например, &&) для тех же целей.

Избегайте неопределенности

Предположим, что вы используете и конструктор с одним аргументом, и операцию преобразования для выполнения некоторого преобразования (например, time24 в timel2). Как компилятор узнает, какое из преобразований выполнять? Никак. Компилятор не следует вовлекать в ситуации, в которых ему не известно, что следует делать, так как он выдаст ошибку. Поэтому избегайте выполнения одного преобразования с помощью нескольких разных способов.
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100