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

Вниз

Срединедельная задачка   Найти похожие ветки 

 
MBo ©   (2009-10-07 09:54) [0]

Функция, перегруженная не по типу аргументов, а по типу результата.
Возможно ли это?

Код ниже работает  (BDS 2006).
Как может выглядеть функция RepeatThem? ;)


procedure TForm2.Button4Click(Sender: TObject);
var
 i: Integer;
 s: string;
begin
 i := RepeatThem(13, 3); // a * b
 s := RepeatThem(13, 3); // строковое представление а повтор b раз
 Caption := IntToStr(i) + " " + s; //получается "39 131313"
end;


 
Дмитрий С ©   (2009-10-07 10:17) [1]


> Код ниже работает  (BDS 2006).

А в BDS как это работает?


 
KilkennyCat ©   (2009-10-07 10:20) [2]

overload + небольшое извращение с параметрами,
например:
function RepeatThem(X: Integer; Y : Integer): integer; overload;
function RepeatThem(X: Integer; Y : Byte): string; overload;


 
KilkennyCat ©   (2009-10-07 10:25) [3]

гм... я неправ. мой вариант будет корректно работать на однозначном соответствии параметров...


 
oxffff ©   (2009-10-07 10:26) [4]

решение

TTrickSfuff=record
a,b:integer;
class operator implicit(a:TTrickSfuff):integer;
class operator implicit(a:TTrickSfuff):string;
end;

 TForm2 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
 function RepeatThem(a,b:integer):TTrickSfuff;
   { Public declarations }
 end;

function TForm2.RepeatThem(a, b: integer): TTrickSfuff;
begin
result.a:=a;
result.b:=b;
end;

class operator TTrickSfuff.implicit(a:TTrickSfuff):integer;
begin
result:=a.a*a.b;
end;

class operator TTrickSfuff.implicit(a:TTrickSfuff):string;
var i:integer;
   s:string;
begin
s:=inttostr(a.a);
for i := 1 to a.b do result:=result+s;
end;

procedure TForm2.FormCreate(Sender: TObject);
var a:integer;
   b:string;
begin
a:=RepeatThem(13,3);
b:=RepeatThem(13,3);
showmessage(inttostr(a)+ " "+b);
end;


 
TUser ©   (2009-10-07 10:48) [5]


> procedure TForm2.Button4Click(Sender: TObject);
> var
>  i: Integer;
>  s: string;
> begin
>  i := RepeatThem(13, 3); // a * b
>  s := RepeatThem(13, 3); // строковое представление а повтор
> b раз
>  Caption := IntToStr(i) + " " + s; //получается "39 131313"
> end;

Turbo Delphi - заменил в одной из функций е (англ) на е (рус) - скомпилировалось

счастливой отладки :)


 
Kolan ©   (2009-10-07 11:37) [6]

В книге Марка Кенты есть пояснение решения oxffff, который, если кто не понял использовал перегрузку операторов:
Notice that both the Implicit and Explicit operators can be overloaded based on the function return type, which is generally not possible for overloaded methods.
стр. 103


 
Игорь Шевченко ©   (2009-10-07 11:45) [7]


> Функция, перегруженная не по типу аргументов, а по типу
> результата.
> Возможно ли это?


Может, и возможно, но не надо. Любое трюкачество (а то, что приведено, именно трюкачество) не вносит ясности в программу.


 
MBo ©   (2009-10-07 11:45) [8]

>oxffff ©   (07.10.09 10:26) [4]
Угу, я тот же подход использовал.


 
SP   (2009-10-07 12:43) [9]


> Как может выглядеть функция RepeatThem?


Хм... Давно уже не писал ничего на Дельфи, так что скорее всего ошибаюсь, но нельзя ли такое замутить используя тип результата - variant?


 
MBo ©   (2009-10-07 13:02) [10]

>не вносит ясности в программу.
Это да, здесь разбираться в коде будет сложнее, так что практическое использование сомнительно.

>но нельзя ли такое замутить используя тип результата - variant?
нет, функция должна срабатывать по-разному в зависимости от типа результата. А с variant преобразование его в нужный тип происходит уже позже.


 
Virgo_Style ©   (2009-10-07 13:30) [11]


> Любое трюкачество (а то, что приведено, именно трюкачество)
> не вносит ясности в программу.


ShowMessage( "y(x) = " + y(x) ); //imho выглядит лучше, чем ... + FloatToStr( y(x) ) ...

хотя пример, пожалуй, довольно надуманный.


 
Игорь Шевченко ©   (2009-10-07 13:34) [12]


> ShowMessage


ShowMessageFmt ?


 
Лёша   (2009-10-07 14:01) [13]

А как будет работать функция, если я напишу:
var
V: Variant;
begin
V := RepeatThem(13, 3);


 
oxffff ©   (2009-10-07 14:20) [14]


> MBo ©   (07.10.09 13:02) [10]
> >но нельзя ли такое замутить используя тип результата -
> variant?
> нет, функция должна срабатывать по-разному в зависимости
> от типа результата. А с variant преобразование его в нужный
> тип происходит уже позже.


Можно. TcustomVariantType в руки. С перекрытием метода CastTo


 
KSergey ©   (2009-10-07 14:23) [15]

> Лёша   (07.10.09 14:01) [13]

Скажет "упс..."


 
cwl ©   (2009-10-07 15:57) [16]

> Kolan ©   (07.10.09 11:37) [6]
> В книге Марка Кенты
в какой? - кажись, у меня ее нет


 
Kolan ©   (2009-10-08 10:39) [17]

В той что про Делфи 2007, cwl.



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

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

Наверх




Память: 0.51 MB
Время: 0.011 c
15-1254694926
Германн
2009-10-05 02:22
2009.12.06
Планировщик Windows


15-1254826192
Windows User
2009-10-06 14:49
2009.12.06
Скрыть таскбар...


9-1183225938
@!!ex
2007-06-30 21:52
2009.12.06
OpenGL. Модуль для работы с шейдерами.


2-1255684283
Aleks
2009-10-16 13:11
2009.12.06
Как отключить гор.скроллбар у ListView?


15-1254861007
Юрий
2009-10-07 00:30
2009.12.06
С днем рождения ! 7 октября 2009 среда