Главная страница
    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
15-1255082295
cwl
2009-10-09 13:58
2009.12.06
ваш музыкальный аггрегатор


2-1255947778
Инна
2009-10-19 14:22
2009.12.06
Дерево каталогов&список файлов


15-1255020008
Piter
2009-10-08 20:40
2009.12.06
PHP: error_reporting() возвращает непредвиденно ноль


2-1255623783
Nucer
2009-10-15 20:23
2009.12.06
Пустая ли строка


2-1255669952
d@nger
2009-10-16 09:12
2009.12.06
путь к базе Firebird





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