1. 程式人生 > >Delphi中的介面和抽象類

Delphi中的介面和抽象類

介面:Interface

 Delphi中介面的關鍵字是Interface,但它和Pascal單元中的Interface沒有任何聯絡。 

1、抽象類

Delphi中的抽象類只定義行為的類,它規定了由此派生的類必須具備某些行為。但是抽象類不實現這些行為,而必須由其派生類去實現這些行為。所以,它只是一種“抽象”的類,而且,我們無法為抽象類建立例項。比如這段程式碼:

TCode = class

Protected

  function Decode(Src: String): String; virtual; abstract;

  function Encode(Src: String): String; virtual; abstract;

End;

這是段程式碼定義了一個有密碼的抽象類,它規定了該類的兩個行為,即編碼和解碼。但它只是規定了這兩個行為而沒有去實現它們,因為具體到不同的加密體系,它們編碼和解碼的行為是不一樣的,所以這兩個行為交由具體的派生類去實現。這是一段合法的程式碼,但是當我們試圖去建立它的例項的時候Delphi就會丟擲一個EAbstractError的異常,因為我們不能為一個抽象類去建立它的例項。

 抽象類只定義了行為而沒有去實現它們,所以它是“抽象”的。

 2、介面和抽象類的不同

介面也定義了一系列的行為而沒有去實現這些行為,這一點上它和抽象類是一樣的。準確地說,介面只是規定了介面的提供者和介面的使用者之間的協議。

既然有了抽象類了為什麼還要介面?那一定是介面和抽象類有不同的地方,正是這種不同使它們應用在不同的場合或者滿足不同的需要。弄清楚這些不同之處的過程,也就是我們理解介面這個概念的過程。

我們以同樣的內容來宣告一個介面:

ICode = interface

  function Decode(Src: String): String;

  function Encode(Src: String): String; 

End;

從形式上看它和抽象類還是有點區別的:

1) 介面都以“I”打頭(類以“T”打頭)

2) 介面的關鍵字是interface(類的關鍵字是class)

3) 因為介面中所有的函式和過程都是虛的,所以無須再加上virtual的關鍵字

但以上的區別只是形式上的,還有一些實質上的區別:

1) 對介面建立例項的程式碼在Delphi中是非法的,在編譯期就會出現異常

2) 介面中所有的方法都是公有的,因此不能對介面的域進行定義

3) 在介面中不能申明變數,這是它和類的一個很大的區別,因為介面只定義了行為而對實現這些行為不做規定,但是如果允許介面定義變數,則就會在某種程度上干預或限制實現行為的方法

4)介面是不變的,也就是說,一旦宣告並公開了某個介面後就不允許再對它進行修改,如果我們要增刪它所規定的行為,就只能另外宣告一個介面

 3、介面的GUID

GUID是“全球唯一識別符號”的縮寫,它藉助複雜的演算法而保證在全球範圍內的唯一性。每個介面都有一個GUID,系統據此註冊和呼叫介面。事實上,上面那段宣告介面的程式碼是不完整的,完整的宣告程式碼看上去應該是這樣的:

ICode = interface

  ['{56E57F5F-5DD8-42FC-8D27-C35968C4474E}']

  function Decode(Src: String): String;

  function Encode(Src: String): String; 

End;

好在我們不必去關心GUID是怎樣產生的,當我們需要給一個介面建立一個GUID時,我們只要在Delphi的IDE中同時按下Ctrl、Shift和G三個鍵,游標所在的位置就會出現一個GUID。其實這不是Delphi自己胡編出來的GHID,而是Delphi呼叫了Windows的API的函式CoCreateGuid建立的,它藉助開放軟體基金會(OSF)定義的演算法,從統計學的角度說,能保證其全球唯一性。

相關推薦

在JDK1.8介面抽象

public abstract class Person { // 1,可以定義成員變數 //2, 可以是任意許可權修飾符 private int a = 1; protected int b =1; public int c = 1; //3,

【詳細】JAVA介面抽象的區別

介面是常用的,在這裡都不舉例程式碼了 抽象類 介面 實現方式 實現方式 介面完全是抽象的。它根本不存在方法的實現 介面完全是抽象的。它根本不存在方法的實現 構造器 構造器 抽

Java介面抽象的學習總結

對於介面和抽象類,自己也不是很清楚,特別是對於其內部的一些約束,總是記不得,所以在此做一定的記錄,供大家學習使用。 在java語言中,abstract class和interface是支援抽象類定義的兩種機制。在面向物件的概念中,我們知道所有的物件都是通過類來描繪的,但是反過來

Delphi介面抽象

介面:Interface  Delphi中介面的關鍵字是Interface,但它和Pascal單元中的Interface沒有任何聯絡。  1、抽象類 Delphi中的抽象類只定義行為的類,它規定了由此派生的類必須具備某些行為。但是抽象類不實現這些行為,而必須由其派生類去實

如何在Java選擇介面抽象

什麼是抽象類? 摘要意味著某些東西不是完全具體的 - 它只是一個想法或某事的要點。因此,當我們討論抽象類時,它意味著一個本身沒有具體實現的類。這只是為其他具體類建立的結構或指南。我們可以說抽象類是具體類的靈魂。這就是我們“擴充套件”抽象類的原因。抽象類應該只有那些屬性和方法,沒有它們就不能存在具體的類。

C#介面抽象學習

今天學習了介面和抽象類,但並沒有很好的進行整理,所以現在寫的時候,腦子裡多少有點亂亂的,先從介面開始吧。 interface 介面,規定了所有派生類的需要遵循的標準,介面定義了需要做些什麼,但是沒有具體的做法,做法的實現由派生類來做。 介面的定義使用關鍵字Interface,由於需要派生類繼承,所以

Java序列化的方式、object的方法、介面抽象的區別、ArrayList在迴圈過程刪除

Java序列化的方式 a.是相應的物件實現了序列化介面Serializable,這個使用的比較多,對於序列化介面Serializable介面是一個空的介面,它的主要作用就是標識這個物件時可序列化的,jre物件在傳輸物件的時候會進行相關的封裝。 b.Externlizab

Java介面抽象的區別?(抽象可以定義變數)

介面是公開的,裡面不能有私有的方法或變數,是用於讓別人使用的,而抽象類是可以有私有方法或私有變數的, 另外,實現介面的一定要實現接口裡定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是介面,然後是抽象類實現介面,最後才到具體類實現。 還有,介面可以實現多重繼承,而一個類只能

java自動拆裝箱,介面抽象

1.Java支援的資料型別有哪些?什麼是自動拆裝箱? Java語言支援的8中基本資料型別是: byte short int long float double boolean char 自動裝箱是Java編譯器在基本資料型別和對應的物件包裝型別之間做的一個轉化。比如:把int轉化成Integ

java介面抽象異同點與在專案的應用

1包 作用: 管理類 定義: package 包名; package必須作為原始檔 的第一條語句 包名的命名規則 使用其他包中的類 完整類名 先import匯入類,再使用 2 Eclipse 3 訪問許可權 類的訪問許可權: 公共類, 非公共類 公共類的應用場景

JAVA:介面抽象的區別

1.從設計層面來說,抽象是對類的抽象,是一種模板設計 ,介面是行為的抽象,是一種行為的規範 介面 interface 抽象類 介面中所有方法都是抽象的 抽象類中可以有抽象方法和普通方法 一

介面抽象得區別

首先是基本定義 介面: 使用介面(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。 介面是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。 介面中定義的所有方法都必須是公有,這

Java特性-介面抽象區別

抽象類是自底向上抽象出來的,介面則是自頂向下設計出來的。 抽象類是對事物本身的抽象,比如貓類,狗類就可以抽象為動物類。 介面是對行為的抽象,比如男人要吃飯,女人也要吃飯,吃飯就可以抽象為介面。 抽象類表示的是這個物件是什麼,介面表示的是這個物件能幹什麼。 所以

java介面抽象的區別

全域性變數的區別 介面中所有的全域性變數預設為 public static final,處於方法區的常量池中,且是靜態域中的成員 抽象類的全域性變數無硬性約束 方法的區別 介面 介面

Java 介面抽象可以被new麼?——順便總結內部類

轉載:https://blog.csdn.net/hackersaillen/article/details/47281549 背景:     最近有同事跟我說了他面試時遇到的問題,考官問:“介面和抽象類可以被new嘛?”。這可能不是考官的原話,但是據他表達考官大概就是這

c#介面抽象區別

轉載自:https://www.c-sharpcorner.com/article/overview-of-abstract-class-and-interface/ Introduction In this article, I will explain about abstrac

介面抽象是否繼承了Object

我們先看一下Java的幫助文件對於Object的描述: Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implem

c#介面抽象的區別

   大家都容易把這兩者搞混,我也一樣,在聽李建忠老師的設計模式時,他也老把抽象類說成介面,弄的我就更糊塗了,所以找了些網上的資料.       一、抽象類:     

介面抽象的使用上的區別選擇

    介面與抽象類的使用上的區別和選擇:       首先,對於抽象類它的作用主要用於繼承和重寫,裡面可以有普通方法,但在設計上面,通常把其派生類的共有屬性和方法抽象出來,其中所有派生類中不變的方法,在抽象類中用普通方法寫出來,而所有派生類中變化的

介面抽象的相同不同之處

共性:不斷的抽取,抽取出抽象的概念    不能建立物件(不能例項化)   區別1:與類的關係        類與介面是實現關係,一個類可以實現多個介面        類與抽象類是繼承關係,Java中的繼承是單一繼承,一個類只能有一個父類,Java中的繼承是多層繼承   區別2:成員