Sign in Join
Wiki copytemporary

Object Oriented Programming with Free Pascal and Lazarus/ja: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## 概要
22
33Pascal に関する優れたチュートリアルは数多くあるが、このチュートリアルは初心者をさらに [[Turbo Pascal]],、[[Delphi]]、[[Free Pascal]] / [[Lazarus|Lazarusにより]]提供される標準 [[Pascal|Pascalの]]拡張である、[[Glossary|オブジェクト指向プログラミングを]]深く理解することを目的としている。
44
55[[Glossary|オブジェクトは]]標準パスカルの構造の[レコード](http://wiki.lazarus.freepascal.org/Record)構造の拡張である。
66
77標準のテキストベースのPascalプログラミングは、1つのことを非常に巧みにこなす伝統的なUnixアプリケーションのようなアプリケーションを作るうえではよいものである。
88
99プログラムが行う「1つのこと」は非常に複雑なアクションであるかもしれないし、ユーザーに複数のメニュー駆動型オプションを提供するかもしれない。しかし、本質的には、ユーザーがキーボードで入力するコマンドに従い、そのレスポンスを端末やプリンターに表示することに制限されている。
1010
1111[[Glossary|グラフィカルユーザーインタフェース (GUI)を]]提供するために、ある種のオブジェクト指向プログラミングメソッド(C言語やその派生、もしくはVisual Basic、例えば[[Glossary|Lazarusを]]用いる、あるいは用いない[[Glossary|Free PascalのようなPascalの]]派生[[Glossary|OO]])が用いられるのは通常のことである。
1212
1313GUIでは、ユーザーには以下のような様々な、道具やアクションに紐づけられた[[Glossary|ウイジェットのセットからなる]]、整頓された多くの画像が示される。
1414
1515- メニューから選択する
1616- ファイルを開く、保存する
1717- インターネットに接続する
1818- 算術演算を行う
1919
2020など。
2121
2222ユーザーは、画面上でマウスまたはその他のポインター/選択ツールを移動し、マウス ボタンのクリックまたはキーの押下に応じて実行されるアクションを選択することを期待している。
2323
2424複雑なグラフィカル ユーザー インターフェイスを処理するシステムは、標準の Pascal またはその他のほぼすべてのプログラミング言語で作成できるものの、それぞれのグラフィカルオブジェクトが、画面上で、すべてのプロパティとプロシージャ、共通の構造とともに使用法が結びつけられた関数を持つことのできる、オブジェクト指向システムを用いるほうがはるかにたやすい。
2525
2626## オブジェクト - 現実世界の相似
2727
2828病院や診療所で採取された血液サンプルの例を考えてみよう。
2929
3030### 血液サンプル
3131
3232物理的なサンプルは文字通り「実体」- **object**であり、情報、ドキュメント、他の多くの物理的なオブジェクトが紐づけられている。
3333
3434- **サンプルの入った試験管**、の型は医師が望む試験の種類を規定する
3535
3636- **ローカルルール** (または *メソッド*, *スタンダードオペレーティングプロシージャ*) は看護師や技師にサンプルを集める指示を出す
3737 - どの種類の試験管が用いられるべきか
3838 - サンプルがどのように扱われるべきか
3939 - 検査室に運ばれるまでどのように保存されるべきか
4040
4141- **ラベル**は以下の細目について記載されている
4242 - サンプルの識別記号番号
4343 - 患者の氏名と誕生日
4444 - 採取した日付と時刻
4545 - 必要とする検査
4646
4747- **要望文書** それはサンプルとともに検査室へもたらされ、指示には
4848 - サンプルの識別記号番号
4949 - 指示した医師のID
5050 - 医師が望んだ検査
5151 - 患者のより詳しい情報
5252 - 確認が求められている、可能性がある診断
5353
5454患者のカルテには、医師がしかるべき時に期待する結果を確認させる、要望文書のコピーが加えられる。
5555
5656- 検査室では - **ローカルメソッド**が以下を規定する
5757 - どのようにサンプルが分析されるか
5858 - どの機器を用いるか
5959 - どのようにその機器が補正され、運転されるべきか
6060 - どのように結果が保存され、形式が整えられるか
6161 - 医師に結果を報告すること
6262
6363実際の **結果** が医師の診断を助けるために記録され、患者のカルテに検査結果のコピーが挟まれる。
6464
6565物理的なサンプルは参照、確認、あるいはさらなる検査のために保存されるか、流しに捨てられる、あるいは焼却処分される。これを述べた方法があるだろう。
6666
6767医師はサンプルが採取されるたびに、いちいちすべての細目と指示を書き込む必要はなく、検査室でそのサンプルがどのように検査されるかほとんど知らないだろう。この様々な課程の細目は、以前のサンプル採取と分析から**継承**され、全体の結果に対する、一定の計画、血液サンプルに対して考えらえる、ドキュメントとデータ、その基礎のメソッドを複合が**オブジェクト**である。 医師の考えでは、血液サンプルはその結果とほぼ同じ実体とみなされ、看護師や技師にとっては、サンプル、チューブ、ラベル、および保管状態が再び単一の実体を成す。
6868
6969### 別の例 - 自動車
7070
7171もし、血を見るのが嫌ならば、同様の理屈が車庫から、修理場へ運ばれる自動車にも適用できる。 それは以下よりなっているだろう:
7272
7373- 自動車自体
7474- 所有者によって保存されている、登録証、車両ナンバー(車両ナンバープレートを含む)、保険証、購入の領収書、部品、修理などの書類
7575- 燃料消費履歴
7676- その自動車を使うことのできる運転者、およびその免許書
7777- 修理場でのサービス記録
7878- 定期点検とメンテナンスの方法(メソッド)と手順(プロシージャ)を追う書類
7979- 非定期点検、修理を追うメソッド
8080- 顧客の支払い情報
8181
8282## プログラミング例
8383
8484こんな実社会の事例に没頭するのはもうたくさんだ! 主題の[[Object Pascal|Object Pascalでのプログラミングに]]進もう。
8585
8686Free Pascal/Lazarusでいくつかのコントロールを持つ簡単なフォームを作ることを考える。
8787
88-<div class="floatleft">
89-
90-<figure>
91-<img src="ObjectInspector-TForm-ja.png" title="ObjectInspector-TForm-ja.png" />
92-<figcaption>ObjectInspector-TForm-ja.png</figcaption>
93-</figure>
94-
95-</div>
96-
97-<div class="floatright">
98-
99-<figure>
100-<img src="BlankForm-ja.png" title="BlankForm-ja.png" />
101-<figcaption>BlankForm-ja.png</figcaption>
102-</figure>
88+![](/wiki-images/2/2f/ObjectInspector-TForm-ja.png)
10389
104-</div>
90+![](/wiki-images/1/19/BlankForm-ja.png)
10591
10692Lazarus IDEを起動すると、プログラマにはフォーム設計の様々なコントロールや、オブジェクトを置くことを促す、空のテンプレートがもたらされる。
10793
10894あらかじめ作られたフォームがすでにオブジェクトであるとこに注意すること。それは位置(上辺、左)、大きさ(高さ、幅)、色、テキストを加えるときのデフォルトのフォントなどのプロパティを持つ。
10995
11096------------------------------------------------------------------------
11197
11298もしボタンコントロール(TButton型)がフォームに置かれると、それは、オブジェクトインスペクタで検討できるそれ自身の一連のプロパティを持つ。
11399
114100そのプロパティのいくつかはフォームと似たような名前を持っている。これはある共通のその派生クラスによって、どのようにそのプロパティが定義され、扱われるかをレイアウトする祖先クラスから**継承**されたプロパティであることが理由である。
115101
116102プロパティ同様に、オブジェクトインスペクタはアプリケーションがどのように、例えばマウスボタンクリック(OnClick)もしくは位置や、大きさ、他のプロパティを変更(OnChange)したときに、それらを扱うかを指示するメソッドであるイベントハンドラにアクセスする**イベント(Events)**という名前のタブを持つ。
117103
118104フォーム上の物理的な画像であるボタンは、そのプロパティとイベントハンドラと相まって、パスカルでは単一の実体**オブジェクト(Object)**とみなされる。
119105
120-<div class="floatleft">
121-
122-<figure>
123-<img src="ObjectInspector-TButton-ja.png" title="ObjectInspector-TButton-ja.png" />
124-<figcaption>ObjectInspector-TButton-ja.png</figcaption>
125-</figure>
126-
127-</div>
128-
129-<div class="floatright">
130-
131-<figure>
132-<img src="FormWithButton-ja.png" title="FormWithButton-ja.png" />
133-<figcaption>FormWithButton-ja.png</figcaption>
134-</figure>
135-
136-</div>
137-
138-<div class="floatright">
106+![](/wiki-images/8/8e/ObjectInspector-TButton-ja.png)
139107
140-<figure>
141-<img src="Source_FormWithButton1-ja.png‎" title="Source_FormWithButton1-ja.png‎" />
142-<figcaption>Source_FormWithButton1-ja.png‎</figcaption>
143-</figure>
108+![](/wiki-images/c/c8/FormWithButton-ja.png)
144109
145-</div>
110+![](/wiki-images/5/52/Source_FormWithButton1-ja.png%E2%80%8E)
146111
147112## 標準パスカルに対するオブジェクト指向拡張
148113
149114Pascalのレコード構造はオブジェクトを定義することで拡張された。
150115
151116### オブジェクト
152117
153118オブジェクトは特別な種類のレコードである。 レコードには、次のすべてのフィールドが含まれる。 (従来のレコードと同様に) オブジェクトの定義で宣言されるが、プロシージャと関数はレコードの一部であるかのように宣言でき、オブジェクトの型に関連付けられたメソッドへのポインタとして保持されるようになった。
154119
155120例えば、平均を計算するメソッドともに実数値の配列を保持するオブジェクトを仮定する。
156121
157122``` pascal
158123Type
159124 Average = Object
160125 NumVal: Integer;
161126 Values: Array [1..200] of Real;
162127 Function Mean: Real; { 配列の平均値を計算する }
163128 End;
164129```
165130
166131「オブジェクト」はフィールドとメソッドを「親」オブジェクトから「継承」することができる。これはこれらのフィールとメソッドが、「子」として宣言されたオブジェクトに含まれているかのように、用いることができることを意味する。
167132
168133さらに、視認性の観念は、フィールド、プロシージャ、関数がpublic、protected、privateとして宣言することを可能とした。デフォルトではフィールドとメソッドはpublicで、現在のユニットの外側へエクスポートできる。Protectされたフィールドやメソッドは現在の祖先オブジェクトから派生したオブジェクトにとってのみ利用可能である。Privateで宣言されたフィールドや、メソッドは現在のユニットでのみアクセスが可能である:そのスコープは現在のユニットの実装に限られている。
169134
170135### クラス
171136
172137オブジェクトはFree PascalとLazarusではそう頻繁には用いられない。むしろ、クラス(Class)は広く用いられる。クラスはほとんどオブジェクトと同様に宣言されるが、オブジェクト自身というよりはオブジェクトに対するポインタである。技術的には、これはプログラムのヒープに割り当てられるが、オブジェクトはスタックに割り当てられる。
173138
174139これはクラス宣言の典型的な例である:
175140
176141``` pascal
177142{-------------------------------------------}
178143{ LCLからのクラス宣言の例 }
179144{-------------------------------------------}
180145 TPen = class(TFPCustomPen)
181146 private
182147 FColor: TColor;
183148 FPenHandleCached: boolean;
184149 FReference: TWSPenReference;
185150 procedure FreeReference;
186151 function GetHandle: HPEN;
187152 function GetReference: TWSPenReference;
188153 procedure ReferenceNeeded;
189154 procedure SetHandle(const Value: HPEN);
190155 protected
191156 procedure DoAllocateResources; override;
192157 procedure DoDeAllocateResources; override;
193158 procedure DoCopyProps(From: TFPCanvasHelper); override;
194159 procedure SetColor
195160 (const NewColor: TColor; const NewFPColor: TFPColor); virtual;
196161 procedure SetFPColor(const AValue: TFPColor); override;
197162 procedure SetColor(Value: TColor);
198163 procedure SetMode(Value: TPenMode); override;
199164 procedure SetStyle(Value: TPenStyle); override;
200165 procedure SetWidth(value: Integer); override;
201166 public
202167 constructor Create; override;
203168 destructor Destroy; override;
204169 procedure Assign(Source: TPersistent); override;
205170 property Handle: HPEN read GetHandle write SetHandle; deprecated;
206171 property Reference: TWSPenReference read GetReference;
207172 published
208173 property Color: TColor read FColor write SetColor default clBlack;
209174 property Mode default pmCopy;
210175 property Style default psSolid;
211176 property Width default 1;
212177 end;
213178```
214179
215180このクラスは他の**parent(親)**もしくは**ancestor(祖先)**クラス(*TFPCustomPen*)のインスタンスとして宣言されていることに注意すること。その祖先から、すべてのプロパティとメソッドを**inherit(継承)**している。このクラスはそれ自身のフィールドを有しており、以下にグループ化されている。
216181
217182- **private** - これはここで定義されたアイテムが、同じプログラムユニットの他のクラスもしくはプロシージャ/関数からのみ用いるあるいは、見ることができる(この例では、*Graphics*から、そのように他のクラスのいずれ、例えば、同じユニットの*TBitMap*、*TPicture*などでもそれらを使うことができる)ことを意味する。それらは本質的にはローカル変数(例えば*FColor*、*FPenHandleCached*)もしくは、ローカルで用いられるメソッド(*GetHandle*、*SetHandle*)だが、**protected**もしくは**public**節で宣言されたアイテムで用いる、あるいは参照されることができる。
218183- **protected** - これはここで定義されたアイテムが、この**祖先**クラスから派生したクラスにとってのみ用いる、あるいは見ることができることを意味し、そのプロパティとメソッドを継承する。
219184- **public** - これはここで定義されたアイテムが[[Glossary|Uses]]句の現在のユニットを含むどのプログラミングユニットからも利用できることを意味する。
220185- **published** - は**public**節と同様であるが、コンパイラが、これらのクラスの自動的ストリーミングにとって必要な型情報も生成する。パブリッシュされたアイテムはLazarusのオブジェクトインスペクタに通常現れる。もし、パブリッシュされたリストがない場合、オブジェクトインスペクタには、いつもすべての**public**フィールドが現れる。
221186
222187### メソッド
223188
224189メソッドは標準のプロシージャ、もしくは関数に似ているが、いくつかの**指令(directive)**を持つ。 上記で定義されているメソッドのいくつかは指令、**virtual**、他は**override**指令が付けられている。
225190
226191- **virtual** はこのメソッドの型、もしくは実際のインスタンスがコンパイル時に知られていないことを意味するが、何のサブプログラムが実際にこのメソッドを呼ぶかによって、実行時に選択される。これはクラスの定義において場所取りとして、考えることができる。
227192- **override**は実行時のローカルな定義が、特にもしそれが**実質的(virtual)**であるならば、派生クラスから継承された定義の場所をとってかわることを意味する。もし、特に、祖先クラスで定義されたメソッドを使いたいときは、特異的に**継承された**句とともに呼ぶ必要がある。
228193
229194Virtualあるいはoverride指令のないメソッドは**静的(static)**メソッド(Pascalにおける通常の種類)である。Virtualあるいはoverride指令は**動的(dynamic)**である。
230195
231196メソッドの特定のインスタンスは:
232197
233198- **create** - メモリの割り当て、全ての必要かつ、様々なプロパティを設定/初期化するためにな情報を一緒に集める、**コンストラクタ(constructor)**である。
234199- **destroy** - 順に従い、論理的にシステムからクラスのすべての部品を取り除く、そして再使用するためシステムにそのリソースを返す**ディストラクタ(distructor)**である。
235200
236201### プロパティ
237202
238203プロパティは従来的なPascalにおける通常のフィールドに似ているが、**読み取り(read)**あるいは/および**書き込み(write)**指示子を持つ。
239204
240205- **read**指示子はプロパティの正しい結果を返すフィールド、あるいは関数である。上記の例では、プロパティ*Color*は使われる値を保持しているローカル変数である、読み取り指示子*FColor*を持っている。もしプロパティが**read**を持ち、**write**指示子を持っていないなら、それは読み取り専用(read-only)である。
241206- **write**指示子は特定の場所の値を保持する、フィールドもしくはプロシージャである。上の例では*Color*は特定の場所に対する色を書き込むためのプロシージャ(**protected**節で宣言されている)である書き込み指示子、*SetColor*を持っている。もしプロパティが**write**を持ち、**read**を持たないなら、書き込み専用(write-only)である。
242207- **default** - **default**値をプロパティに持たせることが可能なことに注意すること。例えば、ここで*Color*が生成時にデフォルト値*clBlack*、もしくは黒を持っている。それは引き続き異なった値が、プログラムの割り当てまたは、オブジェクトインスペクタにより、与えられうる。
243208- **index**指示子は、プロパティ間で共有される、**read** もしくは **write**メソッドが、どのプロパティが望ましいか特定するために用いることのできる整数値である。もし、**index**が**read** もしくは **write**で用いられているなら、指示子はそれぞれ、関数、もしくはプロシージャなければならず、通常のフィールド/値たりえないことに注意すること。
244209
245210#### 例
246211
247212``` pascal
248213 TFooClass = class
249214 private
250215 FIntProp: Integer;
251216 public
252217 property IntProp: Integer read FIntProp write FIntProp;
253218 end;
254219```
255220
256221``` pascal
257222 TFooClass = class
258223 private
259224 function GetListProp(AIndex: Integer): String;
260225 procedure SetListProp(AIndex: Integer; AValue: String);
261226 public
262227 // プロパティのこの型はクラスのpublishedセクションにはないだろう
263228 property ListProp[AIndex: Integer]: String read GetListProp write SetListProp;
264229 end;
265230```
266231
267232``` pascal
268233 TFooClass = class
269234 private
270235 function GetValue(const AIndex: Integer): Integer;
271236 procedure SetValue(const AIndex: Integer; AValue: Integer);
272237 public
273238 // note that the read and write methods are shared
274239 property Value1: Integer index 1 read GetValue write SetValue;
275240 property Value2: Integer index 2 read GetValue write SetValue;
276241 property Value3: Integer index 3 read GetValue write SetValue;
277242 property Value4: Integer index 4 read GetValue write SetValue;
278243 // インデクスは定数か、数値、あるいは型を列挙することもできる
279244 // 例えば:
280245 // property Value: Integer index ord(seSomeEnum) read SomeFunction write SomeProcedure;
281246 end;
282247```
283248
284249## Free Pascal 言語拡張
285250
286251FPCはオブジェクト指向プログラミングをサポートするためにその「標準」Pascal文法にいくつかの言語拡張を含んでいる。
287252
288253- オブジェクト (5 章) [[Programming Using Objects]]
289254- クラス (6 章) [[Programming Using Classes/ja]]
290255- インタフェース (7 章) [[Programming Using Interfaces]]
291256- ジェネリクス (8 章) [[Programming Using Generics]]
292257
293258これらの拡張はFPC Language Reference Guide <http://www.freepascal.org/docs.var>.(訳注: このリンクは無効であるFPCのリファレンスに対するURLは <https://www.freepascal.org/docs-html/current/ref/ref.html> である)で述べられており、それぞれの概念に対するチュートリアルへのリンクもある。Language Reference Guideはこの概要チュートリアルには含まれない文法便覧とさらなる細部を含んでいる。上記には4つの言語仕様が含まれており、[**Objects**](https://www.freepascal.org/docs-html/current/ref/refch5.html#x59-790005)と[**Classes**](https://www.freepascal.org/docs-html/current/ref/refch6.html#x69-930006)はFPCとLazarusにおける、オブジェクト指向プログラミング (OOP)の基礎を成している。OOP初心者にとって、**Objects**セクションはより概説的なセクションで、**Classes**セクションは**Objects**文法に対する類似性と相違性を強調することで、反復を最小限にしている。一般的に **Classes** 実装はDelphi、Lazarus開発者により広く用いられている。FPCではOOPの **Classes** 方言で、何が実際「class」なのかに言及することに「object」がよく使われている。これらのドキュメントは命名上の混乱を最小限にするために記述されているが、このドキュメント以外では、通常、 **Class** から作られるオブジェクトに用語「object」が用いられている。実際、FPCランタイムライブラリ(RTL)は *TObject* と呼ばれる基底 **class** を持つクラスライブラリを含んでいる。
294259
295260古いTurbo Pascal OOP実装に慣れているユーザーはオブジェクト実装が古いTurbo Pascal方言に基づいているため、Classesセクションを初めは飛ばしたいかもしれない。**Classes**セクションはDelphi文法に基づいているため、Delphiユーザーにはなじみがあるはずだ。**Classes**セクションの書き方は**Objects**セクションからの概念を参照しているかもしれないことに注意すること。様々なApple、THINK、MPW Object Pascal方言になじみのあるマッキントッシュ開発者にとって、FPC ObjectsもしくはClasses方言のいずれも直接的な移行パスとならないだろう。2009年 3月時点では、Mac PascalメーリングリストではAppleのObjective C / Cocoa フレームワークにアクセスするためにあるコンパイラサポート(新しい文法)を提供する可能性が議論されている。
296261
297262### オブジェクト指向 Pascal 一般的な概念
298263
299264OOPは利用可能な他の言語仕様と設計に比べ、データの取り扱いとカプセル化とプログラムフローを取り扱う異なる方法を提供する。OOP は多くの場合、グラフィック ユーザー インターフェイス (GUI) や物理システムなどの特定のアプリケーションを、より自然な感覚でモデル化するのに役立つ。しかし、OOPはすべてのアプリケーションに適切ではない。プログラムコントロールはより基本的なPascal手続き的構造ほど明示的ではない。OOPから最も恩恵を受けるためには、学習曲線が急であることを通常必要とする、大きなクラスライブラリの理解が必須とされる。厳格な手続き的コードをメンテナンスすることに比べ、大規模なOOPアプリケーションコードをメンテナンスすることは、その利点と、欠点がある。OO分析、設計とプログラミング技法に対する豊富な学習教材があるが、それらは本稿の範疇を超えてしまう。
300265
301266拡張、あるいはその言語の基本として、OOPフィーチャを取り込んだ多くのプログラミング言語が存在する。このように、OOコンセプトを記述するために多くの異なる用語がある。FPCですら、いくつかの命名上の重複がある。一般的に、OOPはデータ上で機能するデータとプロシージャの関連したセットを明示的に組み合わせ、カプセル化するプログラミングオブジェクト(もしくは、情報ユニット)の概念よりなっている。データは通常、プログラムの実行中に永続的だが、グローバル変数の宣言に固有の問題を軽減するメカニズムが備わっている。さらに、OOP 言語を使用すると、以前に定義されたオブジェクトに基づいてオブジェクトを段階的に変更および/または拡張できる。 この機能は通常、*継承*および*ポリモーフィズム*という用語で呼ばれる。多くのOOP言語は、1つのオブジェクトに属する、プロシージャを称するのに、*メソッド* もしくは *メッセージ*用語を用いる。OOPの力の源泉はコンパイルバインディングよりも、メソッドの遅い(実行時)、動的なバインディングによって、認識される。このメソッドの動的なバインディングは、プロシージャ変数とプロシージャ パラメータの使用に似ているが、構文の凝集性が高く、関連するデータとのカプセル化が行われ、以前に定義されたメソッドの動作も継承される。次の Wiki ページは、オブジェクト指向の方法での分析、設計、プログラミングについてさらに詳しく知るための出発点を提供する。
302267
303268## さらなる情報
304269
305270これは、この話題についてほんの触りを述べたに過ぎない。より詳細には、[Free Pascal](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html)マニュアルの特に、5章(**Objects**)と6章(**Classes**)を読むことを強く推奨する。
306271
307272ボーランドはまた、寛大にもPDF媒体で、オリジナルのTurbo Pascalマニュアルから、オブジェクト指向プログラミングの章を解放していた。この章ではこの言語仕様をボーランドがTurbo Pascalに導入したときからが書かれている。これは古いかもしれないが、OOPの理論は今日でも非常に関連性がある。[Link](http://geldenhuys.co.uk/articles/)の「その他」のカテゴリから、ダウンロードできる。
308273
309274## 以下も参照のこと
310275
311276- [[Programming Using Classes/ja]]
312277- [[Free Pascal videos|Free Pascal video tutorials]]
313278- [[Lazarus videos|Lazarus video tutorials]]
314279- [[Pascal and Lazarus Books and Magazines]]
315280
316281## 外部リンク
317282
318283- <https://castle-engine.io/modern_pascal_introduction.html> - FPC mode ObjFPC
319284- <http://newpascal.org/assets/modern_pascal_introduction.html> - FPC mode Delphi
320285
321286- <http://en.wikipedia.org/wiki/Object-oriented_programming>
322287- <http://en.wikipedia.org/wiki/OOAD>
323288- <http://en.wikipedia.org/wiki/Object_oriented_design>
324289
325290---
326291*From the Free Pascal wiki, page "Object Oriented Programming with Free Pascal and Lazarus/ja", as it stood on 2024-04-03 after a change by Ariben, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history