クラス名(クラスのオブジェクト).メソッド名はどういう仕様ですか?

解決


Nancy  2005-02-07 23:49:18  No: 13098

あるサンプルで

hogeクラス名(hogeクラスのオブジェクト).メソッド名

という文法があり、入門書を読んでも分かりませんでした。

ためしに以下のようなコードを書いて実験してみたところ、
そのオブジェクトのメソッドにアクセスしているようです。

program Test;

{$APPTYPE CONSOLE}

type
   TPerson = class(TObject)
   private 
   name: String;
   procedure setName(val : string);
   function getName : string;
   end;

   procedure TPerson.setName(val : string);
   begin
      name:=val;
   end; { TPerson }

   function TPerson.getName:string;
   begin
      Result:=name; { 戻り値 }
   end;

var
   hoge  : TPerson;
begin
   hoge:=TPerson.Create;

   hoge.setName('Yukari Tanaka');

   writeln(hoge.getName());
   
   writeln(TPerson(hoge).getName);

   hoge.Free;
end.

これは専門用語ではなんと言うのでしょうか?
googleで調べるキーワードは何が良いでしょうか?

開発環境:Delphi 6.0
OS:WindowsXP


りおりお  2005-02-08 00:28:42  No: 13099

型キャスト または キャスト と言います。
オブジェクトがクラスのインスタンスである場合は、自分自身または上位クラスに
キャストするのは正しい文法です。下位クラスへキャストするときは、is で
正しい下位クラスであることを確認してからキャストします。たとえば Form1
に Button1 を置いて、その OnClick イベントハンドラを

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Sender is TButton then TButton(Sender).Caption := '押したね!';
end;

のようにすると、分かります。 TObject クラスには Caption プロパティーが
ないのでキャストしてからアクセスします。そのほか、VCL では兄弟クラスや
叔父クラスにもキャストしてその protected フィールドにアクセスする方法も
あるようです。キャストの意味がわかれば OOP のうち、継承と多態について
理解できるようになります。また、隠蔽についても一部関係しています。


Nancy  2005-02-08 23:07:45  No: 13100

りおりお様、お返事ありがとうございます。

型キャストまたはキャストだったんですね。

自分自身を引数に入れているので、気が付きませんでした。

また、Sender : TObject の扱いについてのサンプルを提示してくださり
役に立ちました。

>キャストの意味がわかれば OOP のうち、継承と多態について
>理解できるようになります。また、隠蔽についても一部関係しています。
大変勉強になります。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加