Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перегрузка операторов в Delphi [D6]


Шмель ©   (2006-05-10 10:41:00) 

Можно ли перегружать операторы в Delphi (как в C++), например есть класс TMoney. a,b,с:TMoney; и чтоб можно было тупо написать  c:=a+b;


MBo   (2006-05-10 12:47:00) [1]

Для классов перегрузки операторов нет, а вот синтаксис записей в последных версиях Borland DevStudio расширен, добавлена и перегрузка операторов и функции. Пример:

TVec2D = packed record
   X, Y: Double;
 private
 class var
   FFormatStr: string;
   class procedure SetFormatStr(const Value: string); static;
 public
   class operator Implicit(const P: TPoint): TVec2D; overload;
   class operator Explicit(const V: TVec2D): TPoint;
   class operator Equal(const A, B: TVec2D): Boolean;
   class operator NotEqual(const A, B: TVec2D): Boolean;
   class operator Add(const A, B: TVec2D): TVec2D;
   class operator Subtract(const A, B: TVec2D): TVec2D;
   class operator Multiply(const A, B: TVec2D): Double; overload;
   class operator Multiply(const V: TVec2D; const Scale: Double): TVec2D; overload;
   class operator Multiply(const Scale: Double; const V: TVec2D): TVec2D; overload;
   class operator Divide(const V: TVec2D; const Scale: Double): TVec2D;
   class operator Negative(const V: TVec2D): TVec2D;

   class property FormatStr: string read FFormatStr write SetFormatStr;

   function Angle: Double;
   function IsUnit: Boolean;
   function IsZero: Boolean;
   function Length: Double;
   function NegPerp: TVec2D;
   function Perp: TVec2D;
   function ScaleToLen(const NewLen: Double): TVec2D;
   function SquaredLen: Double;
   function ToString: string;
   function UnitVec: TVec2D;
 end;

 V1, V2 : TVec2D;
 P: TPoint;
 Dot: Double;
begin
 P := Point(130, 120);
 V1 := P;    // Implicit
 V2 := V1.Perp;
 V2 := V2 * 3 - V1;     //Multiply, Subtract
 Caption := V2.ToString;
 Dot:= V1 * V2;    //Multiply


TUser   (2006-05-10 12:24:00) [2]

Говорят, в 2005 появился сабж. А в более ранних версиях придется писать в префиксной форме, хотя инфиксная запись, имхо, читабельнее.


Юрий Зотов   (2006-05-10 11:35:00) [3]

> Шмель ©   (10.05.06 11:09) [7]

type
 TMoney = class
   procedure Summarize(MoneyArray: array of TMoney);
   Dollars: integer;
   Cents: integer;
 end;

procedure TMoney.Summarize(MoneyArray: array of TMoney);
var
 i: integer;
begin
 Dollars := 0;
 Cents := 0;
 for i := Low(MoneyArray) to High(MoneyArray) do
 begin
   Inc(Dollars, MoneyArray[i].Dollars);
   Inc(Cents, MoneyArray[i].Cents);
 end;
 Inc(Dollars, Cents div 100);
 Cents := Cents mod 100
end;

Чем это хуже перегрузки?

ИМХО, ничем. Зато вызывающий код становится удобочитаемым.


Сергей М.   (2006-05-10 11:20:00) [4]


> согласитесь с:=a+b выглядит и лучше и понятнее


Не соглашусь.


Шмель   (2006-05-10 11:18:00) [5]


> Что мешает реализовать оную безо всяких сомнительных "перегрузок"
> ?


Дык, согласитесь с:=a+b выглядит и лучше и понятнее чем скажем,
c.add(a);c.add(b);. Ну чтож нет так нет.  

а вот про Custom Variant Types я почитаю,


Сергей М.   (2006-05-10 11:13:00) [6]


> просто реализовать операцию сложения.


Что мешает реализовать оную безо всяких сомнительных "перегрузок" ?

В D6 перегрузок операторов нет.


Шмель   (2006-05-10 11:09:00) [7]


> b.Dollars:=3;
> b.Cents:=50;//типа $2.40


упс.

b.Dollars:=2;
b.Cents:=40;//типа $2.40


Dmitrij_K   (2006-05-10 11:08:00) [8]


> Lamer@fools.ua ©
Да.

Это что-то новое, ни в какой книге такого не видел. Напишите пожалуйста примерчик.


Lamer@fools.ua   (2006-05-10 11:07:00) [9]

P.S. Смотреть в сторону Custom Variant Types.


Lamer@fools.ua   (2006-05-10 11:06:00) [10]

>> Шмель ©   (10.05.06 10:41)

> Можно ли перегружать операторы в Delphi (как в C++), например есть класс TMoney. a,b,с:TMoney; и чтоб можно было тупо написать  c:=a+b;
Да.


Шмель   (2006-05-10 11:05:00) [11]


> Как ты себе вообще это представляешь - суммировать два экз-
> ра некоего класса ?


Да просто реализовать операцию сложения.

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

Type TMoney= class
       Dollars:integer;
       Cents:Integer;
....
end;

a,b,c:TMoney;

a.Dollars:=2;
a.Cents:=50;//типа $2.50

b.Dollars:=3;
b.Cents:=50;//типа $2.40

ну и следующая операция

c:=a+b;

должна положить в c $4.90, т.е учитывать должна что в баксе 100 центов

Это не суть важно, просто столкнулся с этим, и стало интересно.


Dmitrij_K   (2006-05-10 11:02:00) [12]

Ну не позволяет это делать язык delphi.
Вам религия мешает написать процедуру сложения?


Сергей М.   (2006-05-10 10:47:00) [13]


> тупо написать


Паскаль не для "тупо написать".

Паскаль - язык строгий, дурных вольностей не допускает.


> есть класс TMoney. a,b,с:TMoney


> c:=a+b


Как ты себе вообще это представляешь - суммировать два экз-ра некоего класса ?

Неверной дорогой идете, товарисч ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо