Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

Перегрузка операторов в Delphi   Найти похожие ветки 

 
Шмель ©   (2006-05-10 10:41) [0]

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


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


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


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

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


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


> c:=a+b


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

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


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

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


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


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


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

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

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 центов

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


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

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

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


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

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


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


> Lamer@fools.ua ©
Да.

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


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


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


упс.

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


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


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


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

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


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


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


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

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


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


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


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


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

> Шмель ©   (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;

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

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


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

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


 
MBo ©   (2006-05-10 12:47) [13]

Для классов перегрузки операторов нет, а вот синтаксис записей в последных версиях 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




Страницы: 1 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
1-1147212202
Германн
2006-05-10 02:03
2006.06.18
TListView


1-1147539751
Stalker.mg
2006-05-13 21:02
2006.06.18
полоса прокрутки на главной форме


2-1149101351
MAXHo
2006-05-31 22:49
2006.06.18
Как сделать такую панельку на форме?


3-1145610421
RomanH
2006-04-21 13:07
2006.06.18
Управвление триггером в хранимой процедуре


5-1133558900
Adil
2005-12-03 00:28
2006.06.18
Svyaz mejdu komponentami v odom unite