Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.013 c
3-1145945499
sally
2006-04-25 10:11
2006.06.18
Список источников ODBC


3-1145961078
Alpine
2006-04-25 14:31
2006.06.18
Вопрос по тригерам


15-1148312666
Bogdan1024
2006-05-22 19:44
2006.06.18
квартиру в кредит


2-1149001787
Махоня
2006-05-30 19:09
2006.06.18
как связать Word c Delphi


15-1148249744
SkyRanger
2006-05-22 02:15
2006.06.18
Как извлечь из локального SVN номер релиза?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский