Форум: "Основная";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];
ВнизПерегрузка операторов в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c