2013-04-10 48 views
1

是否有可能在Delphi 7中創建一個可以通過Visual Form Inheritance技術繼承的抽象類?如果是這樣,請舉個例子。德爾福7:通過VFI的抽象類

任務是這樣的。我想創建一個表單,作爲其他兩個表單的基本表單,它將繼承該表單的所有屬性。這兩個繼承形式將用於向數據庫添加新東西(例如創建產品項目)並編輯這些東西。所以,我猜基本形式應該被認爲是一個抽象類,應該有好的和取消按鈕和所有繼承類將共享的東西。那麼,它顯然是一個抽象類,因爲除了作爲基於其他表單的表單之外,沒有其他用法。

這裏有一個簡單的圖表說明一點更清晰:

所有的

enter image description here

+0

你能闡述一下你想用這個抽象類來實現什麼(特別是爲什麼它必須是抽象的)? – 2013-04-10 15:29:12

+0

你不能自己嘗試一下嗎?用VFI設置幾個表單,給基類一個抽象方法,看看會發生什麼。 – 2013-04-10 15:46:22

回答

2

首先,我們需要定義什麼抽象類意思。在我看來有兩個競爭定義:

  1. 抽象類是一個不能被實例化的類。這是最常用的定義。
  2. 抽象類是一個包含多個抽象方法的類。

由於Delphi沒有執行定義1的語言機制,所以看起來定義2是適用於這個問題的定義。

而問題的答案是,包含抽象方法的類可以與Visual Form Inheritance一起使用。

Delphi的現代版本允許您使用abstract關鍵字修飾類。但是,這不起作用。你仍然可以實例化這樣一個類。我的理解是abstract關鍵字是爲了Delphi.net編譯器的好處而添加的。

再次,在Delphi的現代版本中,您可以配置編譯器將對具有抽象方法的類的實例化作爲編譯錯誤進行處理。這可能是最接近你可以得到德爾福定義1.

然而,即使這並不完全堅持定義1,因爲這些類可以通過RTTI或虛擬構造函數實例化。而設計組件實例化的機制就是一個很好的例子。

拿這個類,例如:

type 
    TForm1 = class(TForm) 
    public 
    procedure Boo; virtual; abstract; 
    end; 

即使你設置W2000包含抽象方法錯誤,你仍然可以讓框架實例化的類實例的構建選項。只有編寫TForm1.Create時,編譯器纔會對象。

+0

@所有感謝告訴我,我在我刪除的答案中胡言亂語。 – 2013-04-10 16:58:39

+0

好的。我想我應該創建一個普通的表單類,忘記這個抽象的東西。 – Mikhail 2013-04-10 17:17:59

+0

你想抽象什麼?你用Delphi獲得的所有方法都是抽象的。 – 2013-04-10 17:20:25

2

您使用術語抽象,但閱讀你的問題,我嚴重懷疑你是說真的中德爾福抽象的定義方式。我想你的意思是摘要用普通的普通口語的方式表達:你想要設計一個必須被後代改變或添加的部分的表格。摘要 Delphi中的方法意味着沒有實現的類例程。不過這並不重要,因爲完全可以設計一個基本形式,無論是否使用抽象方法。

您可以創建一個設置爲表示對您的圖片/圖如下:

  • 設計形式TBaseForm 2個編輯,2個標籤,2個按鍵和1周的ActionList,
  • 添加3個行動的的ActionList:創建,保存和取消,
  • 指定提前取消操作來CancelButton.Action,
  • 保存表單,
  • 設計一種新的形式,從TBaseForm繼承,與菜單c ommand:文件>新建>其它> [項目名稱]>音素表示
  • 你將有一個新的形式有編輯,標籤,按鈕和動作,
  • 指定的保存動作到另一個按鈕的操作特性,
  • 給它一個「編輯項目」標題,
  • 保存表格,併爲「創建新項目」表單重複它。

如果需要,基礎表單可以有抽象方法。當您在運行時創建一個TBaseForm實例時,編譯器會給出一個警告構造包含抽象方法'TBaseForm.MethodName''TBaseForm'的實例。它仍然是一個警告,直到您在運行時調用該方法時將產生一個抽象錯誤。創建一個實現該方法的後代形式,那麼將不會有警告。在設計器中使用抽象方法創建表單不會產生警告。然而,運行時錯誤仍然可能發生。

2

不,您不能在德爾福Visual形式繼承中以嚴格的德爾福意義上的「抽象」來創建「抽象」基本形式。

但是,根據您的描述,聽起來並不像您實際需要嚴格抽象的基本形式。你根本沒有提到定義抽象方法的要求。

這聽起來像你只需要一個基本形式,從中你可以創建多個不同的專業化後代,可以共享用戶界面和基本形式的實現。

這就是VFI的用途,所以是的,你可以做到這一點。

+0

那麼,你對「抽象類」的定義有什麼看法? – 2013-04-10 17:52:53

+0

我這個OP只是意味着一個沒有實例化的基類(因爲它自己沒有做任何有用的事情)。 – dthorpe 2013-04-10 18:21:52

+0

其實我很有興趣聽到你拿的*抽象類*的意思。今天早些時候被嚴重糾正之後,我認爲這是一個無法實例化的類。這就是你抽象類*所表達的意思嗎? – 2013-04-10 22:42:00