ВУЗ:
Составители:
Рубрика:
32
constructor Rational.CreateNumber;
begin
self.num:=0;
self.den:=1;
end;
constructor Rational.CreateAs(n, m: Integer);
begin
self.SetNum(n);
self.SetDen(m);
end;
Теперь при использовании выражения
r := Rational.CreateNumber;
переменная r получит адрес объекта, поля которого уже содержат кор-
ректные величины 0 и 1. Если же создать объект при помощи инструкции
r := Rational.CreateAs(a, b);
то для инициализации числителя и знаменателя будут использованы ме-
тоды SetNum и SetDen, так что число r окажется равным a/b, лишь если
выражения a и b имеют допустимые значения.
Кроме того, вызывая конструкторы для уже существующего объ -
екта r:
r.CreateNumber;
r.CreateAs(a, b);
можно легко сбросить его значение в 0 или изменить на требуемое .
Некоторым читателям , вероятно, покажется странным, что мы
придумываем все новые имена для конструкторов вместо того, чтобы
воспользоваться весьма уместной здесь перегрузкой или установить для
параметров n и m значения по умолчанию. Сделано это намеренно с це-
лью максимально упростить материал .
К сожалению, вновь добавленные методы не позволяют решить
всех проблем : пользователь по-прежнему может создать новый объект
посред ством обычного конструктора Create, который не гарантирует
корректности его значения. Чтобы ликвидировать такую возможность,
следует не просто добавить к классу новые конструкторы , а переопре-
делить уже существующий. В действительности это очень легко: доста-
точно лишь изменить имя CreateNumber на Create, что мы и сделаем ,
устранив тем самым последний из недостатков библиотеки, перечис -
ленных в начале § 2.1.
constructor Rational.CreateNumber;
begin
self.num:=0;
self.den:=1;
end;
constructor Rational.CreateAs(n, m: Integer);
begin
self.SetNum(n);
self.SetDen(m);
end;
Т еперь при ис пол ь з ов ании в ы ражения
r := Rational.CreateNumber;
перем енная r пол учит ад рес объект а, пол я которого уже с од ержат кор-
рект ны е в ел ичины 0 и 1. Е с л и же с оз д ать объект при пом ощи инс т рукции
r := Rational.CreateAs(a, b);
тод л я инициал из ации чис л ит ел я и з нам енат ел я буд ут ис пол ь з ов аны м е-
тод ы SetNum и SetDen, т ак чточис л оr окажет с я рав ны м a/b, л иш ь ес л и
в ы ражения a и b им еют д опус т им ы е з начения.
Кром е того, в ы з ы в ая конс т рукторы д л я уже с ущес т в ующегообъ-
ект а r:
r.CreateNumber;
r.CreateAs(a, b);
м ожнол егкос брос ит ь егоз начение в 0 ил и из м енит ь на т ребуем ое.
Н екоторы м чит ат ел ям , в ероят но, покажет с я с т ранны м , что м ы
прид ум ы в аем в с е нов ы е им ена д л я конс т рукторов в м ес то того, чтобы
в ос пол ь з ов ат ь с я в ес ь м а ум ес т ной з д ес ь перегруз кой ил и ус т анов ит ь д л я
парам ет ров n и m з начения поум ол чанию. Сд ел аноэтонам ереннос це-
л ь ю м акс им ал ь ноупрос т ит ь м ат ериал .
К с ожал ению, в нов ь д обав л енны е м етод ы не поз в ол яют реш ит ь
в с ехпробл ем : пол ь з ов ат ел ь по-прежнем у м ожет с оз д ат ь нов ы й объект
пос ред с т в ом обы чного конс т рукт ора Create, которы й не гарант ирует
коррект нос т и его з начения. Ч т обы л икв ид иров ат ь т акую в оз м ожнос т ь ,
с л ед ует не прос то д обав ит ь к кл ас с у нов ы е конс т рукт оры , а переопре-
д ел ит ь уже с ущес т в ующий. В д ейс т в ит ел ь нос т и э тоочень л егко: д ос т а-
точно л иш ь из м енит ь им я CreateNumber на Create, чт о м ы и с д ел аем ,
ус т ранив т ем с ам ы м пос л ед ний из нед ос т ат ков библ иот еки, перечис -
л енны хв начал е § 2.1.
32
Страницы
- « первая
- ‹ предыдущая
- …
- 30
- 31
- 32
- 33
- 34
- …
- следующая ›
- последняя »
