Форум: "Прочее";
Текущий архив: 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 theImplicit
andExplicit
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