Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


estra

Вопрос

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

P.S. [offtop]

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

Изменено пользователем estra
Ссылка на комментарий

Рекомендуемые сообщения

  • 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
  • Модераторы

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

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
9 минут назад, krapotkin сказал:

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

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

Изменено пользователем estra
Ссылка на комментарий
  • 0
  • Модераторы
4 минуты назад, estra сказал:

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

прочитал про 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

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

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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