delphi物件導向學習隨筆二:編寫第乙個類
這回,我們討論怎麼編寫我們自己的第乙個類。
在編寫我們自己的類之前,首先要說的是「類的繼承」。
記得前幾天,我在和乙個朋友討論類的特點的時候,他說:「類是可以沒有構造方法的!」其實類必須有至少乙個構造方法的,但是他的話也不全錯,可以理解成「我們可以不實現我們自己的構造方法」。
當我們沒有顯式的為類編寫乙個構造方法的時候,那麼,看上去,這個類好象是沒有構造方法,但是實際上,就算你沒有為這個類編寫乙個屬於你自己的構造方法的時候,該類還是有構造方法的;為什麼呢?因為,在你選定父類並從父類派生(繼承)乙個新的後代類的時候,首先,編譯器會copy乙份父類中「可繼承」的資料成員到新的子類中。
那麼,什麼是可繼承的資料成員呢,我們來看下面的**:
**:tpersistent = class(tobject)
private
procedure assignerror(source: tpersistent);
protected
procedure assignto(dest: tpersistent); virtual;
procedure defineproperties(filer: tfiler); virtual;
function getowner: tpersistent; dynamic;
public
destructor destroy; override;
procedure assign(source: tpersistent); virtual;
function getnamepath: string; dynamic;
end;上面是vcl內部tpersistent類的宣告**,我們可以看到幾個關鍵字private、protected、public,這幾個關鍵字是說明資料成員的訪問限制的,其中:
private: 存在於該訪問限制下的資料成員只能被本類所訪問。
protected: 存在於該訪問限制下的資料成員只能被本類及後代類所訪問。
public: 存在於該訪問限制下的資料成員可以被任何類訪問。
published: 存在於該訪問限制下的資料成員的訪問限制與public一樣,但是在本域下的屬性將會在註冊類的時候被註冊給ide。
automated: 存在於該訪問限制下的資料成員為自動成員,常用於定義嵌入(ole)自動化型別資訊的公共介面。 ps: 該域並不常用,這裡不做介紹
由此可見,所謂的「可繼承」部分是指除"private"域指定的資料成員。
回到上面的問題,由於在繼承新類的時候,編譯器會copy乙份父類所有可繼承部分的資料成員到新的子類中,當沒有為新類編寫構造方法時,新類會呼叫父類的構造方法,如果父類中也沒有編寫構造方法,那麼將層層上溯,直到根類tobject中。
就像上面的類,我們可以看到,在類裡面的確是沒有重寫新的構造方法,但是這個類的構造方法卻是真實的存在的。
現在,我們可以開始編寫第乙個屬於我們自己的簡單的類了:
**:type // 說明我們從這裡開始往下要宣告的是自定義的資料型別
tnewclass = class(tpersistent)
// tnewclass 新類的類名
// tpersistent 父類的類名
private
// 私有域資料成員
protected
// 保護域資料成員
public
// 公共域資料成員
procedure sayhello(); // 我們為類新增的新的方法
published
end; // 類的聲名結束
implementation // 實現部分
procedure tnewclass.sayhello;
// sayhello 方法的實現部分
begin
showmessage('hello');
end;至此,我們完成了乙個簡單的類的編寫。
我們可以寫一段簡單的**來測試類的工作情況:
**:var
newclass: tnewclass; // 定義乙個類 tnewclass 的物件 newclass
begin
newclass:= tnewclass.create; // 為物件 newclass 分配記憶體空間,並建立它
newclass.sayhello(); // 呼叫 sayhello 方法
newclass.free; // 銷毀物件並釋放物件的記憶體空間
end;有時,我們會看到這樣的宣告方式:
**:type
tnewclass = class
...end;這是一種省略父類的宣告方式,當省略了父類的時候,delphi編譯器會把根類tobject當做新類的基類,和
**:type
tnewclass = class(tobject)
...end;
物件導向之編寫乙個完整的類
package com.work.cast public class people class people1else public string getname public void setage int a else public int getage int a public void se...
物件導向之編寫乙個色子類
本人自己摸索的方法 class dice 編寫乙個色子類,要求 1.具有6個面,每個面為一種顏色 2.每種顏色代表乙個數值 1 6 3.實現乙個通過顏色計算兩種其代表數值和的靜態方法 4.實現乙個類方法 gen dice 用於產生這個類的例項 staticmethod def cal color1,...
物件導向編寫乙個計算器
首先分析計算器有加減乘除,取模,求餘等計算方式,所以我們在建立了這個類的同時就應該想到後期肯定需要進行這方面的擴充套件,所以在設計的時候就應該盡量不修改原有 的前提下進行功能的擴充套件,也就是降低物件之間的耦合度。廢話不多說,如下 namespace program public print dec...