• 0
estra

Перезагрузка операторов для классов

Вопросы

Вопрос к разработчикам. Почему в платформе FM перезагрузка операторов для классов работает на для всех платформ, в частности работает для Android и не работает для Windows?

P.S. [offtop]

Нет ли в планах добавления возможности перезагрузки операторов для классов в VCL?

Изменено пользователем estra

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 ответов на этот вопрос

  • 0

В данном случае в примере нет большой необходимости, но раз вы просите…

unit Unit2;

interface

type
  TTest = class
  public
    class operator Equal(a,b: TTest): Boolean;
  end;

implementation

{ TTest }

class operator TTest.Equal(a, b: TTest): Boolean;
begin

end;

end.

Этот код под Windows не скомпилируется в принципе, а под Android скомпилируется нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

хитро

если вместо класса record, то все работает нормально

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

да, я знаю, с record проблем нет. вопрос именно про классы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

может я чего-то не понимаю, но я делаю вот так

type
  TmyMethod = class
	class function AccSet(const phone: integer; name: string): string; overload; static;
	class function AccSet(const phone: integer; bday: TDate): string; overload; static;
  end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
18 минут назад, ZuBy сказал:

может я чего-то не понимаю, но я делаю вот так

может… class operator и class function не одно и то же

34 минуты назад, krapotkin сказал:

Похоже все дело в ARC. Жаль…

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

там же объясняется причина - кто будет удалять созданные объекты, если нет ARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 минут назад, krapotkin сказал:

там же объясняется причина - кто будет удалять созданные объекты, если нет ARC

это вполне мог бы быть тот, кто их создал (разработчик), по моему в этом нет ничего криминального. Ведь перезагрузка операторов у записей допускается. А если у записи есть конструктор, который, допустим, выделяет память под хранение необходимых этой записи данных, чем она от класса отличается принципиально?

Изменено пользователем estra

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 минуты назад, estra сказал:

class operator и class function не одно и то же

прочитал про class operator, даже не знал про такое

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 минуты назад, ZuBy сказал:

прочитал про class operator, даже не знал про такое

век живи, век учись

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

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

конструктор записи - чисто номинальный аналог события OnCreate

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Я и не говорю, что он там есть, я говорю, что его можно сделать.

type
  TMyRec = record
  public
    Value: ^Integer;
    constructor Create(Val: Integer);
    class operator Add(a, b: TMyRec): TMyRec;
  end;

var
  Form1: TForm1;
  r1, r2, r3: TMyRec;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
   r1 := TMyRec.Create(3);
   r2 := TMyRec.Create(4);
   r3 := r1 + r2;
   ShowMessage(IntToStr(r3.Value^));
end;

{ TMyRec }

class operator TMyRec.Add(a, b: TMyRec): TMyRec;
begin
   Result := TMyRec.Create(a.Value^ + b.Value^);
end;

constructor TMyRec.Create(Val: Integer);
begin
   GetMem(Value, SizeOf(Value));
   Value^ := Val;
end;

такая запись уже мало чем отличается от класса. однако если в такой записи переопределить операторы, никого не заботит вопрос о том, кто будет очищать выделенную память. кто должен освобождать r3? вопрос в том, почему с записями это никого не волнует, а с классами волнует? Почему бы и классам не дать возможность перегружать операторы?

Изменено пользователем estra

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да ладно вам.

У меня для всех классов почти на автомате уже есть функции Equals и Assign

Так что и Add и Multiply добавлю, ничего

А сахар лучше вон a+=5; пусть добавят ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

холивар начинается, это ни есть хорошо. хотелось бы узнать ответ разработчиков по существу вопроса…

Add и Multiply - дело вкуса, а лично мне по вкусу перегрузить операторы, чем городить функции.

сахар сомнительный, ибо тогда на плюсы будет смахивать :) а так можно далеко зайти. я бы, например, не отказался от тернарного оператора a = (b > c) ? 1 : 2

но это все лирика, топик о перезагрузке операторов, давайте не отклоняться от темы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

аж слезу пустил от 

7 часов назад, krapotkin сказал:

a+=5

 

7 часов назад, estra сказал:

a = (b > c) ? 1 : 2

было бы круто такие вещи видеть в делфи. Пусть и на плюсы будет смахивать - кого раздражает, не обязательно пользоваться))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу