Delphi 연산자 재부팅(1)

2956 단어 Delphi
사실 Delphi는 2006년에 연산자 재부팅을 지원했지만, for Win32 버전은 Record에서만 지원합니다.
연산자 재부팅은 무슨 쓸모가 있습니까?예를 들면 다음과 같습니다.
예를 들어'장삼','이사'두 사람이 함께 너를 만나러 오면 너는'너희 둘은 누가 크니?'라고 물어볼 수 있다.
사실 너는 "너희 둘 중 누구의 나이가 많니?"라고 묻고 있다.그러나 생활 속에서 사람들은 일반적으로 이렇게 수다스럽지 않다.
프로그램에서 이렇게 간소화할 수 있습니까?이것은 "연산자 재부팅"을 통해서만 할 수 있습니다.
먼저'둘 중에 누가 나이가 많아요?'원시적인 예를 써라.


unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;



type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



type

  TMyRec = record

    name: string;

    age: Word;

  end;



procedure TForm1.Button1Click(Sender: TObject);

var

  r1,r2: TMyRec;

  str: string;

begin

  r1.name := '  '; r1.age := 18;

  r2.name := '  '; r2.age := 81;



  if r1.age > r2.age then

    str := r1.name

  else

    str := r2.name;



  ShowMessageFmt('%s   ', [str]); {     }

end;



end.


 
   

위에는 r1을 사용합니다.age > r2.age는 나이를 비교하는데 r1>r2로 비교할 수 있다면'너희 둘은 누가 크니?'끝.
이렇게 하려면 ">"연산자를 다시 불러와야 합니다.이른바 중재 연산자는 어떤 연산자에게 새로운 의미와 기능을 부여하는 것이다.
우리가 다시 불러올 수 있는 연산자는 델피의 기존 연산자일 뿐입니다. (전부는 아닙니다.)C++도 그렇습니다.
대응하는 지시자로 이 연산자를 표시해야 한다. 예를 들어'>'는
GreaterThan 표현;C++는 그렇지 않습니다.
중재 연산자는 방법을 통해 실현되지만 방법의 지시자는
class operator(function 또는 proceture 아님).
예를 들어 위의 record는 다음과 같이 설명할 수 있습니다.


type

  TMyRec = record

    name: string;

    age: Word;

    class operator GreaterThan(a,b: TMyRec): Boolean;

  end;


아직 방법이 있습니다. (유감스럽게도 Ctrl+Shift+C로 자동으로 만들 수 없는 것이 있습니다. 복사하십시오.)


class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean; {           : "TMyRec."}

begin

  Result := a.age > b.age;

end;


다음은 전체 코드입니다.


unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;



type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



type

  TMyRec = record

    name: string;

    age: Word;

    class operator GreaterThan(a,b: TMyRec): Boolean;

  end;



class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean;

begin

  Result := a.age > b.age;

end;



procedure TForm1.Button1Click(Sender: TObject);

var

  r1,r2: TMyRec;

  str: string;

begin

  r1.name := '  '; r1.age := 18;

  r2.name := '  '; r2.age := 81;



  if r1 > r2 then

    str := r1.name

  else

    str := r2.name;



  ShowMessageFmt('%s   ', [str]); {     }

end;



end.


 
   

이 테스트 안에는 약간의 빈틈이 있다. 예를 들어, 나이가 같으면 어떻게 합니까?진지하게 따질 필요가 없다. 단지 이것을 빌려 이치를 설명할 뿐이다.

좋은 웹페이지 즐겨찾기