亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi中的類和對象

2019-11-18 18:39:27
字體:
來源:轉載
供稿:網友
  談談Delphi中的類和對象
1.登不了大雅之堂地理解幾個概念
   說到類和對象,我們不能不提及這樣幾個概念:類,對象,實例。就我個人覺得可
以這樣來理解:對象指的是泛稱,自然界的任何實體都可以看成一個對象;而類則是
以這些對象某些特征而分成的一系列的種類;實例則是特指屬于某一個類的一個對象。
好啦,這些大道理我就不用多說了。不如來一個“背道而馳”的作法,我們用Delphi
code 來闡述這些外國人提出的一些令我們中國人不好理解的概念吧:
var
  ABtn:TButton;
義ABtn是屬于TButton類的一個對象,但ABtn不能說是一個實例,因為它還沒有
創建,所以我們說這是定義了一個對象,如果說定義了一個實例,多多少少有
些不夠確切。:)
begin
  ABtn:=TButton.Create(Self);//創建一個TButton的實例
  ABtn.Caption:='對象';
  ABtn.Free;
end;

2.對象是一個地地道道的指針
   從物理角度來看,對象就是一段地址空間,這段地址空間的標志就是我們定義的
類“變量”。所以我們可以把對象看成一個類的指針。大家知道,要訪問一個指針就
必須對指針初始化。對象的既然是一個指針,也必須對它進行初始化。如何初始化呢?
還是說指針的初始化吧。對于一個指針可以有以下兩種方法來進行初始化:
(一)直接分配
var
  Pint:^Integer;
begin
  new(Pint);
  Pint^:=12;
  Dispose(Pint);
end;
(二)指向別的已分配空間的變量
var
  Pint:^Integer;
  i:integer;
begin
  i:=12;
  Pint:=@i;
end;
有趣的是,對象這種“指針”也有兩種方法初始化
(一)直接分配
var
  AForm:TForm;
begin
  AForm:=TForm.Create(Self);
  AForm.ShowModal;
  AForm.Free;
end;
(二)指向別的已分配空間的實例
var
  AForm:TForm;
begin
  AForm:=Self;
  AForm.Caption:='知道了嗎?為什么會這樣呢';
end;
file://這個AForm和它所指向的Form實例共用同一段地址單元,所有對AForm操作都將反應
file://到它所對應的Form實例之上。
說到這,我們就很好解釋為什么過程(函數)的對象參數傳遞時,象這樣這的格式:
(一)PRocedure SetEdit(var Edit:TEdit);
    begin
      Edit.Text:='11';
    end;

(二)procedure SetEdit(Edit:TEdit);
    begin
      Edit.Text:='11';
    end;
效果是一樣的了。(一)是把一個TEdit實體作為參數引用的形式進行參數傳遞,(二)是
把一個TEdit的對象“指針”作為參數傳遞。

3.類可以理解成一種特殊的數據類型
    我們知道數據類型可以進行強制類型轉化,類即然可以理解成一種數據類型,那
么它也應該可以進行類類型轉。比方如下代碼為一個按鈕(Button1)的單擊事件:
(一)
procedure TForm1.Button1Click(Sender: TObject);
var
  ACaption:String;
begin
  ACaption:=TButton(Sender).Caption;//Sender從TObject轉化到TButton
  ShowMessage(Format('You clicked ''%s'' !',[ACaption]));
end;
在這段代碼中,Sender是一個TObject型對象,我們把它強制轉化為TButton類型。如你
看得不清楚,可以參照一下我們通常的數據類型的轉化:
(二)
procedure TForm1.Button1Click(Sender: TObject);
var
  S_Str:String;
  P_Str:PChar;
begin
  S_Str:='I love China!';
  P_Str:=PChar(S_Str);
  S_Str:='';
  S_Str:=String(P_Str);
  ShowMessage(S_Str);
end;
但是在面對對象的程序設計過程中,強調的是安全性,如(一)的強制類型轉化存在著不
安全性。如下的代碼,依然是寫Button1.OnClick事件:
(三)
procedure TForm1.Button1Click(Sender: TObject);
begin
  TCanvas(Sender).Brush.Color:=clRed;
end;
執行一下,就會出錯。這樣豈不是違背了面對對象的程序設計的宗旨了嗎?沒有,即然
是類,就應該有類特定的類強制轉化方法,改(三)的方法如下:
(四)
procedure TForm1.Button1Click(Sender: TObject);
begin
  (Sender as TCanvas).Brush.Color:=clRed;
end;//用as來轉化,as就可以把錯誤抓住,不會影響程序的正常運行。
說到這我順便提一下VB吧,如果學過VB的人可能覺得其中的控件數組比較爽,尤其是在
編寫象計算器這樣的程序時。但Delphi給我們什么呢?答案是Delphi也能快速簡潔的開
發出這樣的程序。如是操作:在窗體上放一個Edit和十個Button,把Button.Caption分
別設為'0','1','2',...'9',然后寫一個按鈕的OnClick事件如下:
(五)
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text:=Edit1.Text+(Sender as TButton).Caption;
end;
把別的Button的OnClick事件都關聯到Button1Click上,運行程序。拍拍手!這樣計算器
程序的雛形就具備了。我們用Delphi的類類型轉化,開發出來類似VB中的控件數組功能
的程序也是很棒的嘛!:)

4.抽象類和它的實例
    Delphi中有一種類為抽象類,你不能天真的直接為它創建一個實例。如:TStrings
類。如下代碼:
(一)
var
  StrLst:TStrings;
begin
  StrLst:=TStrings.Create;
  StrLst.Add('I love Japan!');
  StrLst.Free;
end;
這是不對的。那如何為諸如TStrings這樣的抽象類構造實例呢?答案是借助它的非抽
象子類。我們知道TStrings有一個TStringList非抽象子類。我們就可以這樣作:
(二)
var
  StrLst:TStrings;
begin
  StrLst:=TStringList.Create;//借助其子類的構造器,對StrLst進行子類化
  StrLst.Add('I love China!');
  StrLst.Free;
end;
(三)
var
  StrLst:TStringList;
begin
  StrLst:=TStringList.Create;
file://放棄吧,不要再用抽象類,完全用它的“兒子”來你的事吧 
  StrLst.Add('I love China!');
  StrLst.Free;
end;

5.類是一種對數據和操作高度的封裝機制
(一)數據封裝
unit Unit2;

interface
type
  TEmployee=class
  private
    FName:String;
  public
    Constructor Create;
    function  GetName:String;
    procedure SetName(AName:String);
  end;
implementation

{ TEmployee }

constructor TEmployee.Create;
begin
  FName:='BlazingFire';
end;

function TEmployee.GetName: String;
begin
  Result:=FName;
end;

procedure TEmployee.SetName(AName: String);
begin
  FName:=AName;
end;

end.
如上代碼,我們就用了一個過程SetName和一個函數GetName對私有變量FName進行完全的
封裝。我們要對FName操作就只有這樣:
uses
  unit2;
procedure TForm1.Button1Click(Sender: TObject);
var
  AEmployee:TEmployee;
begin
  AEmployee:=TEmployee.Create;
  AEmployee.SetName('Rose');//利用SetName來設置FName
  MessageBox(Handle,PChar(AEmployee.GetName),'Empoyee',0);
  file://用GetName來訪問FName
  AEmployee.Free;
end;
(二)操作封裝
unit Unit2;

interface
type
  TDivision=Class
  public
    file://多態性讓你的程序更據有“柔韌性”
    function GetDiv(Num1,Num2:Double):Double;overload;
    function GetDiv(Num1,Num2:integer):integer;overload;
  end;
implementation

{ Division }

function TDivision.GetDiv(Num1, Num2: Double): Double;
begin
  try
    Result:=Num1/Num2;
  except
    Result:=0;//提供彈形處理機制,處理除數為0情況
  end;
end;

function TDivision.GetDiv(Num1, Num2: integer): integer;
begin
  try
    Result:=Num1 div Num2;
  except
    Result:=0;//提供彈形處理機制,處理除數為0情況
  end;
end;

end.
如上代碼我們通過類的多態性機制把除法分別處理成整除和非整除,又通過異常處理屏
去除數為0的情況,從而保證操作的安全性,在調用時,我們就可以這樣來:
uses
  unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Division:TDivision;
  IValue:integer;
  FValue:Double;
begin
  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);
  Division.Free;
end;
 
6.類是一種代碼重用機制
    比方在5中我們想對這個類加上一個GetAdd函數來作加法運算就可以用類的繼承。如
下寫就可以了:
(一)
unit Unit2;

interface
type
  TDivision=Class
  public
    function GetDiv(Num1,Num2:Double):Double;overload;
    function GetDiv(Num1,Num2:integer):integer;overload;
  end;
type
  TOperation=Class(TDivision)
  public
    function GetAdd(Num1,Num2:Double):Double;
  end;
implementation

{ Division }

function TDivision.GetDiv(Num1, Num2: Double): Double;
begin
  try
    Result:=Num1/Num2;
  except
    Result:=0;
  end;
end;

function TDivision.GetDiv(Num1, Num2: integer): integer;
begin
  try
    Result:=Num1 div Num2;
  except
    Result:=0;
  end;
end;

{ TOperation }

function TOperation.GetAdd(Num1, Num2: Double): Double;
begin
  Result:=Num1+Num2;
end;

end.
這里我們從TDivision繼承了一個子類TOperation。TOperation就可以即有TDivsion
公有方法GetDiv,又有自己的獨特的方法GetAdd。這是類為我們提供的“魚和熊掌兼
得”之法。不錯吧。:)


上一篇:Delphi中關于TApplication類的詳解

下一篇:Delphi版OpenGL樣例代碼導游

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲91精品在线观看| 国产精品久久久久久久7电影| 亚洲国产成人精品久久久国产成人一区| 国产精品久久久久久久av大片| 久热精品视频在线免费观看| 国产精品自产拍高潮在线观看| 国产亚洲成av人片在线观看桃| 亚洲美女黄色片| 97视频在线观看免费高清完整版在线观看| 国产精品久久久久久av| 成人羞羞国产免费| 国产网站欧美日韩免费精品在线观看| 日韩精品一区二区视频| 久久精品成人一区二区三区| 久久精品美女视频网站| 国产视频999| 亚洲欧美另类在线观看| 亚洲精品久久久久久久久久久久| 5252色成人免费视频| 精品无码久久久久久国产| 国产精品吹潮在线观看| 日韩美女写真福利在线观看| 久久国产精品99国产精| 国内伊人久久久久久网站视频| 亚洲综合中文字幕在线观看| 九九热精品视频在线播放| 日韩免费在线看| 最近2019中文免费高清视频观看www99| 国产mv免费观看入口亚洲| 亚洲综合在线做性| 日韩av在线网站| 精品国产依人香蕉在线精品| 久久精品欧美视频| 久久久噜久噜久久综合| 激情懂色av一区av二区av| 亚洲一区999| 亚洲美女性生活视频| 亚洲日韩中文字幕| 在线看日韩欧美| 亚洲第一福利在线观看| 中文字幕一区日韩电影| 亚洲视频电影图片偷拍一区| 成人免费观看a| 色狠狠av一区二区三区香蕉蜜桃| 亚洲欧洲午夜一线一品| 国产精品夫妻激情| 北条麻妃一区二区三区中文字幕| 国产成人短视频| 国产91免费看片| 日韩av免费在线| 欧美精品18videosex性欧美| 日韩精品在线免费观看| 91久久久久久久| 97在线视频免费播放| 97精品视频在线| 国产精品久久久久91| 国产亚洲精品综合一区91| 日韩欧美在线观看视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产97在线视频| 欧美极品少妇xxxxⅹ裸体艺术| 欧美尺度大的性做爰视频| 国产精品极品美女在线观看免费| 亚洲综合色av| 亚洲国产三级网| 中文字幕日韩精品有码视频| 中文字幕亚洲欧美日韩在线不卡| 韩日精品中文字幕| 亚洲一区二区自拍| 日本久久久久久| 久久精品91久久久久久再现| 欧美精品在线第一页| 成人网址在线观看| 久久91超碰青草是什么| 国产97在线视频| 久久精视频免费在线久久完整在线看| 成人女保姆的销魂服务| 欧美精品18videos性欧| 日韩精品一区二区视频| 国产精品久久9| 久久久精品国产网站| 日韩国产精品一区| 欧美电影免费观看高清完整| 久久久女人电视剧免费播放下载| 亚洲国产天堂久久综合| 在线观看精品国产视频| 性色av香蕉一区二区| 欧美激情国产精品| 欧美精品一二区| 动漫精品一区二区| 欧美亚洲第一区| 久久国产色av| 91精品国产91久久久久久| 免费91麻豆精品国产自产在线观看| 精品国产91久久久| 亚洲第一福利在线观看| 亚洲人成亚洲人成在线观看| 国产一区二区黑人欧美xxxx| 日本精品视频在线观看| 国产精品第100页| 国产精品久久久久久久久久三级| 国内精品视频一区| 久久久久久久一区二区| 最近日韩中文字幕中文| 亚洲日本中文字幕免费在线不卡| 国产精品一区电影| 九九热精品视频国产| 色悠久久久久综合先锋影音下载| 日韩在线观看免费高清完整版| 国产一区二区三区免费视频| 92看片淫黄大片看国产片| 国产成人精品免高潮费视频| 精品人伦一区二区三区蜜桃免费| 欧美日韩成人黄色| 亚洲免费伊人电影在线观看av| 91精品久久久久久久久不口人| 亚洲视频在线观看视频| 国产精品18久久久久久首页狼| 欧美日韩国产一区在线| 国产精品电影在线观看| 欧美在线激情网| 久久久久久久久91| 亚洲精品美女视频| 国产极品精品在线观看| 亚洲国产婷婷香蕉久久久久久| 国内精品视频一区| 国产欧美日韩精品在线观看| 国产91色在线|免| 国产999精品久久久| 国产精品久久久av| 欧美性xxxx| 国产日韩精品视频| 国产精品成人一区二区| 国产成人高潮免费观看精品| 亚洲自拍偷拍第一页| 欧美大片在线免费观看| 国产精品高潮呻吟久久av野狼| 久久九九全国免费精品观看| 欧美激情亚洲视频| 国产精品久久77777| 国产欧美在线播放| 亚洲人成电影网站色www| 91精品国产综合久久香蕉| 欧美激情国产日韩精品一区18| 91亚洲精品在线观看| 国内精品久久影院| 欧美精品在线网站| 91干在线观看| 成人午夜黄色影院| 久久久91精品| 久久国产精品免费视频| 欧美黑人巨大精品一区二区| 日本成人激情视频| 欧洲中文字幕国产精品| 亚洲美女av网站| 97在线视频国产| 亚洲韩国欧洲国产日产av| 国产精品一区二区三区久久| 精品一区二区三区三区| 91av视频在线免费观看| 久久精品国产一区二区电影| 亚洲欧美国产一本综合首页| 日韩a**站在线观看| 亚洲精品国产精品乱码不99按摩|