Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.004 c
2-1255610309
XTasy
2009-10-15 16:38
2009.12.06
Глобальные переменные delphi


15-1254746040
XXL
2009-10-05 16:34
2009.12.06
Что случилось с оборудованием от AMD ?


2-1255696453
FEV
2009-10-16 16:34
2009.12.06
События для динамических кнопок...


15-1254837325
VladOfMonster
2009-10-06 17:55
2009.12.06
Срочно. Установка wine в Linux


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский