Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2011, 02:26   #1
Alt
Лжец и смутьян
Форумчанин
 
Аватар для Alt
 
Регистрация: 03.04.2009
Сообщений: 194
Радость Перегрузка стандартных действий

Где-то слышал, что в последних версиях Делфей можно перегружать плюс, минус, и т.д., просьба пролить свет на этот вопрос!
Помогли тебе - помоги другому.
Alt вне форума Ответить с цитированием
Старый 15.01.2011, 02:32   #2
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Тоже слышал... Правда сам работаю с 7 ... Также прошу пролить свет )
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 15.01.2011, 04:59   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

В принципе, там всё просто. Сначал городим нечто вроде:

Код:
type
  myIntString = record
    //
    r_value: string;
    //
    class operator Add(v1: myIntString; v2: Integer): myIntString;
    class operator Add(v1: myIntString; v2: myIntString): myIntString;
    class operator Implicit(v: Integer): myIntString;
    class operator Implicit(const v: string): myIntString;
    class operator Implicit(v: myIntString): Integer;
    class operator Implicit(v: myIntString): string;
    class operator Explicit(v: myIntString): Integer;
    class operator Inc(v: myIntString): myIntString;
    class operator Subtract(v1: myIntString; v2: Integer): myIntString;
    class operator Subtract(v1: myIntString; v2: myIntString): myIntString;
  end;


{ myIntString }

// --  --
class operator myIntString.Add(v1: myIntString; v2: Integer): myIntString;
begin
  result := Integer(v1) + v2;  // result := Implicit(Explicit(v1):Integer + Implicit(v2):Integer):myIntString;
end;

// --  --
class operator myIntString.Add(v1: myIntString; v2: myIntString): myIntString;
begin
  result := v1 + Integer(v2);	// result := v1 + Explicit(v2):Integer;
end;

// --  --
class operator myIntString.Explicit(v: myIntString): Integer;
begin
  result := v;	// result := Implicit():Integer;
end;

// --  --
class operator myIntString.Implicit(v: Integer): myIntString;
begin
  result.r_value := IntToStr(v);
end;

// --  --
class operator myIntString.Implicit(v: myIntString): Integer;
begin
  result := StrToInt(v.r_value);
end;

// --  --
class operator myIntString.Implicit(v: myIntString): string;
begin
  result := v.r_value;
end;

// --  --
class operator myIntString.Inc(v: myIntString): myIntString;
begin
  result := v + 1; // result := Add(v, 1): myIntString;
end;

// --  --
class operator myIntString.Subtract(v1: myIntString; v2: Integer): myIntString;
begin
  result := Integer(v1) - v2;
end;

// --  --
class operator myIntString.Subtract(v1, v2: myIntString): myIntString;
begin
  result := v1 - Integer(v2);
end;

// --  --
class operator myIntString.Implicit(const v: string): myIntString;
begin
  result.r_value := v;
end;
После чего можно сочинять смешной код в духе вижуал бейсика:

Код:
var
  r1, r2: myIntString;
  i: Integer;
begin
  r1 := 1;
  r2 := '2';
  //
  r1 := r1 + r2 - '6'; // r1 := Substract(Add(r1, r2): myIntString, Implicit('6'):myIntString);
  //
  inc(r1);
  //
  i := r2 + 3 - r1; // i := Implicit(Substract(Add(r2, 3):myIntString, r1)): Integer;
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 15.01.2011, 06:09   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А если добавить немного анонимности:

Код:
type
  p = reference to function(v: myIntString): Integer;

// -- general recursive myIntString multiplier
function process(v: myIntString; proc: p): Integer;
begin
  if (0 = Integer(v)) then
    result := 1
  else
    result := Integer(v) * process(proc(v), proc);
end;
то можно слегка удивить преподавателей. Вычисление факториала числа 10:

Код:
r2 := '10';
factorial := process(r2, function(v: myIntString): Integer begin result := v - 1; end));
А тут вычисляется ряд N*(N/2)*(N/4)*(N/8)...:

Код:
somevalue := process(N, function(v: myIntString): Integer begin result := Integer(v) shr 1; end));
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 15.01.2011 в 11:39.
veniside вне форума Ответить с цитированием
Старый 18.01.2011, 22:26   #5
Alt
Лжец и смутьян
Форумчанин
 
Аватар для Alt
 
Регистрация: 03.04.2009
Сообщений: 194
По умолчанию

Названия функций Add, Implicit, Explicit, Inc, Subtract - фиксированы?
Помогли тебе - помоги другому.
Alt вне форума Ответить с цитированием
Старый 18.01.2011, 22:40   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

F1.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.01.2011, 23:37   #7
Alt
Лжец и смутьян
Форумчанин
 
Аватар для Alt
 
Регистрация: 03.04.2009
Сообщений: 194
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
У меня не работает справка. За ссылку спасибо.
Помогли тебе - помоги другому.
Alt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение стандартных модулей Delphi Hottabych Общие вопросы Delphi 13 18.08.2010 11:17
Переопределение стандартных функций LeoN PHP 1 11.06.2010 08:18
Перегрузка стандартных операций Новичек_Rudik Помощь студентам 1 19.04.2010 23:32
Не подключается BT-адаптер на стандартных драйверах Web-Gangsta Компьютерное железо 6 22.02.2010 16:49
Отключение стандартных обработок DBnavigator Badrvic Компоненты Delphi 3 14.10.2009 11:40