Delphi のクラスとオブジェクトについて話す
1. 教育を受けていなければ、いくつかの概念を理解することはできません。
クラスとオブジェクトと言えば、クラス、オブジェクト、インスタンスという概念に触れずにはいられません。個人的には大丈夫だと思います
このように理解してください。オブジェクトは一般的な用語を指し、クラスは自然界のあらゆるエンティティをオブジェクトと見なすことができます。
これらのオブジェクトの特定の特性に分類された一連のカテゴリ。インスタンスは、特定のカテゴリに属するオブジェクトを指します。
さて、これらの大きな原則についてはこれ以上説明する必要はありません。 「逆の」アプローチをとってみてはいかがでしょうか。Delphi を使用してみましょう
これらの外国人が提唱した、私たち中国人にとって理解するのが難しいいくつかの概念を説明するコード:
変数
ABtn:Tボタン;
ABtn を TButton クラスに属するオブジェクトとして定義しますが、ABtn はインスタンスであるとは言えません。
インスタンスが定義されると、多かれ少なかれオブジェクトが定義されると言います。
十分に正確ではないものもあります。 :)
始める
ABtn:=TButton.Create(Self);//TButton のインスタンスを作成します
ABtn.Caption:='オブジェクト';
ABtn.無料。
終わり;
2. オブジェクトは完全なポインタです
物理的な観点から見ると、オブジェクトはアドレス空間であり、このアドレス空間のシンボルが定義されます。
クラス「変数」。したがって、オブジェクトはクラスへのポインターとして考えることができます。誰もが知っているように、ポインタにアクセスするには、次のようにします。
ポインタは初期化する必要があります。オブジェクトはポインターであるため、初期化する必要があります。初期化するにはどうすればいいですか?
ポインタの初期化について話しましょう。ポインタを初期化するには 2 つの方法があります。
(1) 直接配布
変数
パイント:^整数;
始める
新しい(パイント);
パイント^:=12;
廃棄(パイント);
終わり;
(2) 他の割り当てられた領域を指す変数
変数
パイント:^整数;
i:整数;
始める
i:=12;
パイント:=@i;
終わり;
興味深いことに、オブジェクトのような「ポインター」を初期化するには 2 つの方法があります。
(1) 直接配布
変数
Aフォーム:Tフォーム;
始める
AForm:=TForm.Create(Self);
AForm.ShowModal;
AForm.Free;
終わり;
(2) 割り当てられた領域の他のインスタンスを指す
変数
Aフォーム:Tフォーム;
始める
AForm:=自己;
AForm.Caption:='知っていますか?なぜこのようなことが起こっているのですか?
終わり;
file://この AForm とそれが指す Form インスタンスは同じアドレス単位を共有し、AForm 上のすべての操作が応答します。
file:// を対応する Form インスタンスに追加します。
そういえば、プロシージャ (関数) のオブジェクト パラメータが次のような形式で渡される理由は簡単に説明できます。
(1)手続き SetEdit(var Edit:TEdit);
始める
Edit.Text:='11';
終わり;
そして
(2) プロシージャ SetEdit(Edit:TEdit);
始める
Edit.Text:='11';
終わり;
効果も同様です。 (1) は TEdit エンティティをパラメータ参照として渡すこと、(2) は
TEdit オブジェクトの「ポインター」をパラメーターとして渡します。
3. クラスは特別なデータ型として理解できます
クラスはデータ型として理解できるため、データ型は強制的に型変換できることがわかります。
そうすれば、クラス型変換も実行できるはずです。たとえば、次のコードはボタン (Button1) のクリック イベントです。
(1つ)
プロシージャ TForm1.Button1Click(送信者: TObject);
変数
Aキャプション:文字列;
始める
ACaption:=TButton(Sender).Caption;//送信者は TObject から TButton に変換します
ShowMessage(Format('''%s'' をクリックしました!',[ACaption]));
終わり;
このコードでは、Sender は TObject 型のオブジェクトであり、それを TButton 型にキャストします。あなたのような
よく見えない場合は、通常のデータ型変換を参照してください。
(二)
プロシージャ TForm1.Button1Click(送信者: TObject);
変数
S_Str:文字列;
P_Str:PChar;
始める
S_Str:='私は中国が大好きです!';
P_Str:=PChar(S_Str);
S_Str:='';
S_Str:=String(P_Str);
ShowMessage(S_Str);
終わり;
しかし、オブジェクト指向プログラミングのプロセスでは安全性が重視され、例えば(1)の強制的な型変換には多くの問題があります。
安全。次のコードは引き続き Button1.OnClick イベントを書き込みます。
(三つ)
プロシージャ TForm1.Button1Click(送信者: TObject);
始める
TCanvas(送信者).Brush.Color:=clRed;
終わり;
実行するとエラーとなります。これはオブジェクト指向プログラミングの目的に違反していませんか?いや、もちろん
クラスの場合、クラス固有のクラス強制メソッドが存在する必要があります。 (3) を変更する方法は次のとおりです。
(4)
プロシージャ TForm1.Button1Click(送信者: TObject);
始める
(TCanvasとして送信).Brush.Color:=clRed;
end;//変換には as を使用します。エラーをキャッチでき、プログラムの通常の動作には影響しません。
そういえば、VB についても触れておきます。VB を学習したことがある方は、特に VB のコントロール配列がより楽しいと感じるかもしれません。
電卓などのプログラムを書くとき。しかし、デルフィは私たちに何を与えてくれるでしょうか?答えは、Delphi も素早く簡潔に開くことができるからです。
このようなプログラムを発行します。これを行う場合: フォームに Edit と 10 個の Button を配置し、Button.Caption を次のように分割します。
これを「0」、「1」、「2」、...「9」に設定しないで、ボタンの OnClick イベントを次のように記述します。
(五)
プロシージャ TForm1.Button1Click(送信者: TObject);
始める
Edit1.Text:=Edit1.Text+(Sender as TButton).Caption;
終わり;
他のボタンの OnClick イベントを Button1Click に関連付けて、プログラムを実行します。この電卓をたたきなさい!
プログラムのプロトタイプが利用可能になりました。 Delphi のクラス型変換を使用して、VB と同様の制御配列関数を開発します。
プログラムも素晴らしいです :)
4. 抽象クラスとそのインスタンス
Delphi には抽象クラスと呼ばれるクラスがあり、単純にそのインスタンスを直接作成することはできません。例: TStrings
親切。次のコード:
(1つ)
変数
StrLst:TStrings;
始める
StrLst:=TStrings.Create;
StrLst.Add('日本が大好きです!');
StrLst.Free;
終わり;
これは正しくありません。では、TString のような抽象クラスのインスタンスを構築するにはどうすればよいでしょうか?答えは、非ポンプ機能を使用することです。
ゾウのサブクラス。 TStrings には TStringList の非抽象サブクラスがあることがわかっています。これを行うことができます:
(二)
変数
StrLst:TStrings;
始める
StrLst:=TStringList.Create;//サブクラス コンストラクターを使用したサブクラス StrLst
StrLst.Add('私は中国が大好きです!');
StrLst.Free;
終わり;
(三つ)
変数
StrLst:TStringList;
始める
StrLst:=TStringList.Create;
file://諦めて、抽象クラスはもう使わず、その「息子」を使って仕事をしてください
StrLst.Add('私は中国が大好きです!');
StrLst.Free;
終わり;
5. クラスは、データと操作を高度にカプセル化したメカニズムです。
(1) データのカプセル化
ユニットユニット2;
インタフェース
タイプ
T従業員=クラス
プライベート
FName:文字列;
公共
コンストラクターの作成。
関数 GetName:String;
プロシージャ SetName(AName:String);
終わり;
実装
{ 従業員 }
コンストラクター TEmployee.Create;
始める
FName:='ブレイジングファイア';
終わり;
関数 TEmployee.GetName: 文字列;
始める
結果:=FName;
終わり;
プロシージャ TEmployee.SetName(AName: String);
始める
FName:=AName;
終わり;
終わり。
上記のコードに示すように、プロシージャ SetName と関数 GetName を使用してプライベート変数 FName を完全に設定します。
カプセル化。 FName で行う必要があるのはこれだけです。
用途
ユニット2;
プロシージャ TForm1.Button1Click(送信者: TObject);
変数
A従業員:T従業員;
始める
AEmployee:=TEmployee.Create;
AEmployee.SetName('Rose');//SetName を使用して FName を設定します
MessageBox(Handle,PChar(AEmployee.GetName),'従業員',0);
file://GetName を使用して FName にアクセスします
A従業員。無料。
終わり;
(2) オペレーションのカプセル化
ユニットユニット2;
インタフェース
タイプ
TDivision=クラス
公共
file://ポリモーフィズムによりプログラムがより「柔軟」になります
関数 GetDiv(Num1,Num2:Double):Double;オーバーロード;
関数 GetDiv(Num1,Num2:integer):integer;オーバーロード;
終わり;
実装
{ 分割 }
関数 TDivision.GetDiv(Num1, Num2: Double): Double;
始める
試す
結果:=Num1/Num2;
を除外する
Result:=0;//除数が 0 の状況を処理するための箇条書き処理メカニズムを提供します。
終わり;
終わり;
関数 TDivision.GetDiv(Num1, Num2: 整数): 整数;
始める
試す
結果:=Num1 div Num2;
を除外する
Result:=0;//除数が 0 の状況を処理するための箇条書き処理メカニズムを提供します。
終わり;
終わり;
終わり。
上記のコードでは、クラスのポリモーフィズム機構を利用して除算を整数除算と非整数除算にそれぞれ処理し、例外処理画面を使用して
呼び出し時に数値が 0 の場合を削除して操作の安全性を確保するには、次のようにします。
用途
ユニット2;
{$R *.dfm}
プロシージャ TForm1.Button1Click(送信者: TObject);
変数
部門:T部門;
IValue:整数;
F値:倍精度;
始める
Division:=TDivision.Create;
IValue:=Division.GetDiv(1,2);
FValue:=Division.GetDiv(1.0,2);
IValue:=Division.GetDiv(1,0);
FValue:=Division.GetDiv(1.0,0);
部門。無料。
終わり;
6. クラスはコード再利用メカニズムです
たとえば、5 では、このクラスに GetAdd 関数を追加して加算演算を実行したい場合、クラスの継承を使用できます。のように
次のように書いてください。
(1つ)
ユニットユニット2;
インタフェース
タイプ
TDivision=クラス
公共
関数 GetDiv(Num1,Num2:Double):Double;オーバーロード;
関数 GetDiv(Num1,Num2:integer):integer;オーバーロード;
終わり;
タイプ
TOperation=クラス(TDivision)
公共
関数 GetAdd(Num1,Num2:Double):Double;
終わり;
実装
{ 分割 }
関数 TDivision.GetDiv(Num1, Num2: Double): Double;
始める
試す
結果:=Num1/Num2;
を除外する
結果:=0;
終わり;
終わり;
関数 TDivision.GetDiv(Num1, Num2: 整数): 整数;
始める
試す
結果:=Num1 div Num2;
を除外する
結果:=0;
終わり;
終わり;
{TOP操作}
関数 TOperation.GetAdd(Num1, Num2: Double): Double;
始める
結果:=Num1+Num2;
終わり;
終わり。
ここでは、TDivision からサブクラス TOPeration を継承します。 TOperation には TDivsion を含めることができます
パブリック メソッド GetDiv には、独自の一意のメソッド GetAdd があります。これが私たちに提供する「ケーキを持って、あなたも食べる」クラスです。
「取得」メソッドは悪くありません:)