程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 理解Delphi的類(十一) - 深入類中的方法(4)

理解Delphi的類(十一) - 深入類中的方法(4)

編輯:Delphi

[6] - 類中的方法重載

//類中的方法重載首先具備前面說過的重載相關的所有特點, 如:TMyClass = class(TObject)
 function Fun(s: string): string; overload;
 function Fun(i: Integer): Integer; overload;
 function Fun(x,y: Integer): string; overload;
end;
//但如果是重載父類中的方法, 如果父類中被重載的方法在本類中沒有重載 的話, 可以省略 overload 指示字
TBass = class(TObject)
 function Fun(s: string): string; {這裡省略了 overload, 當然也可以不省略}
end;
TChild = class(TBass)
 function Fun(i: Integer): Integer; overload;
end;
{這個很好理解, 父類並不知道哪個子類要重載它的哪個方法}

//published 區中的方法命名要有唯一性, 該區域中的方法不能重載!

{這樣是不可以的}TMyClass = class(TObject)
published
 function Fun(s: string): string; overload;
 function Fun(i: Integer): Integer; overload;
end;
//這就有一個問題: 公共區域, 在默認情況下是歸屬於 published 區的, 為什麼公共區域的函數可以重載?
{
 編譯器會把公共區域中的重載函數自動歸類到 public 區, 也可能會給 published 區 一個;
 這是我猜的, 沒有資料可以參考.
 關於這個問題, 我又搞了一個實驗:
}
//在自動生成的 TForm1 類的公共區域添加重載方法:
type
 TForm1 = class(TForm)
 procedure alert(s: string); overload;   {No.1}
 procedure alert(s1,s2: string); overload; {No.2}
 private
  { Private declarations }
 public
  { Public declarations }
 end;
//執行編譯後, 只會留下第一個:
type
 TForm1 = class(TForm)
 procedure alert(s: string); overload;    {No.1}
 private
  { Private declarations }
 public
  { Public declarations }
 end;
[7] - 關於 inherited

// inherited 就是調用父類方法的一個特殊命令; 舉例:unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
 end;
 {建立父類, 類中包括一個函數 Fun 和一個等待覆蓋的虛方法 Proc}
 TBass = class
  procedure Proc; virtual;
  function Fun(x,y: Integer): string;
 end;
 {建立四個子類, 分別覆蓋父類的虛方法}
 TChild1 = class(TBass)
  procedure Proc; override;
 end;
 TChild2 = class(TBass)
  procedure Proc; override;
 end;
 TChild3 = class(TBass)
  procedure Proc; override;
 end;
 TChild4 = class(TBass)
  procedure Proc; override;
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
{ TBass }
function TBass.Fun(x, y: Integer): string;
begin
 Result := IntToStr(x + y); {父類函數是返回兩個數的和}
end;
procedure TBass.Proc;
begin
 ShowMessage('TBass');   {父類的虛方法會彈出信息: TBass}
end;
{ TChild1 }
procedure TChild1.Proc;
begin
 inherited Proc;      {調用父類的 Proc 方法}
end;
{ TChild2 }
procedure TChild2.Proc;
begin
 inherited;         {調用父類的同名方法可以省略方法名}
 ShowMessage('TChild2');  {然後彈出自己的信息框}
end;
{ TChild3 }
procedure TChild3.Proc;
begin
 ShowMessage('TChild3');  {先彈出自己的信息框}
 inherited;         {再調用父類的同名方法}
end;
{ TChild4 }
procedure TChild4.Proc;
begin
 ShowMessage(inherited Fun(11,22)); {調用父類的那個求和的函數}
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved