2017-08-04 46 views
-9

對不起,如果這是一個noob問題(但我是德爾福noob)。Delphi是否爲簡單的常見操作提供編譯器生成的代碼?

讓我們假設下面的代碼

InterfaceUnit.pas

unit InterfaceUnit; 

interface 

type 
    IMyInterface = interface(IInterface) 
     procedure DoStuff(withStuff : Stuff); 
    end; 

    TMyInterfaceHelperClass = class(TInterfacedObject, IMyInterface) 
    public 
     constructor Create(); 
     destructor Destroy(); 
     procedure DoStuff(withStuff : Stuff); virtual; abstract; 
    strict protected 
     {Have tons of standard ways how to process Stuff} 
    end; 

implementation 
{TMyInterfaceHelperClass} 

constructor TMyInterfaceHelperClass.Create(); 
begin 
    inherited Create(); 
end; 

destructor TMyInterfaceHelperClass.Destroy(); 
begin 
    inherited Destroy(); 
end; 

{Have tons of standard ways how to process Stuff implemented here} 
end. 

ImplementationUnit.pas

unit ImplementationUnit; 

interface 

uses InterfaceUnit; 

type 
    TMyInterfaceImplementationClass = class(TMyInterfaceHelperClass) 
    public 
{******************************************************************* 
* The Question is: ... 
*******************************************************************} 
     constructor Create(); 
     destructor Destroy(); override; 
{*******************************************************************} 
     procedure DoStuff(withStuff : Stuff); override; 
    end; 

implementation 
{TMyInterfaceImplementationClass} 


{******************************************************************* 
* ... Why do I need to write that boilerplate code all the time? 
*******************************************************************} 
constructor TMyInterfaceImplementationClass.Create(); 
begin 
    inherited Create(); 
end; 

destructor TMyInterfaceImplementationClass.Destroy(); 
begin 
    inherited Destroy(); 
end; 
{*******************************************************************} 

procedure TMyInterfaceImplementationClass.DoStuff(withStuff : Stuff); 
begin 
    {Combine TMyInterfaceHelperClass to do extraordinary stuff with Stuff} 
end; 

end. 

讓我們跳出代碼,並繼續與純文本。

因爲我來自C++的背景,我想知道爲什麼編譯器不能簡單地生成上面提到的樣板代碼段?

  • 有沒有特別的原因我錯過了,爲什麼上面提到的代碼不能像編譯器那樣以任何體面的C++編譯器的方式生成?
  • 至於目前的情況,我相信有RAD Studio(10)可用的​​宏套件和工具來克服這個問題? (你可以在評論中張貼建議,因爲這將是脫離主題在這裏要求這樣的工具)。
+1

「*我不知道爲什麼編譯器不能簡單地生成上述樣板代碼片段*?」 - 的IDE有諸如[Class Completion](http://docwiki.embarcadero.com/RADStudio/en/Using_Class_Completion)和[Live Templates](http://docwiki.embarcadero.com/RADStudio/en/Using_Live_Templates)等功能來處理這些的東西。 –

+2

@RemyLebeau謝謝你。使用IDE功能修復(解決方法)編譯器缺陷真的是一個好主意嗎?你怎麼看? – user0042

+2

這不是編譯器缺陷。編譯器的責任不是編譯用戶代碼,而是編譯用戶代碼。 *生成用戶代碼是IDE的優點。所有主要的IDE都有與之相關的功能。你理解IDE和編譯器之間的區別,不是嗎? –

回答

4

從某種意義上說,德爾福已經做你所要求的。完全省略構造函數和析構函數聲明。當一個類派生自另一個類時,它會自動繼承基類的構造函數和析構函數,除非你自己。在你的例子中,override是多餘的,可以刪除。

InterfaceUnit.pas

unit InterfaceUnit; 

interface 

type 
    IMyInterface = interface(IInterface) 
    procedure DoStuff(withStuff : Stuff); 
    end; 

    TMyInterfaceHelperClass = class(TInterfacedObject, IMyInterface) 
    public 
    procedure DoStuff(withStuff : Stuff); virtual; abstract; 
    end; 

implementation 

{TMyInterfaceHelperClass} 

end. 

ImplementationUnit.pas

unit ImplementationUnit; 

interface 

uses InterfaceUnit; 

type 
    TMyInterfaceImplementationClass = class(TMyInterfaceHelperClass) 
    public 
    procedure DoStuff(withStuff : Stuff); override; 
    end; 

implementation 

{TMyInterfaceImplementationClass} 

procedure TMyInterfaceImplementationClass.DoStuff(withStuff : Stuff); 
begin 
    {Combine TMyInterfaceHelperClass to do extraordinary stuff with Stuff} 
end; 

end. 
+0

FWIW,不需要兩個類:'TMyInterfaceHelperClass'和'TMyInterfaceImplementationClass'。特別是虛擬類('TMyInterfaceHelperClass'是一個虛擬類)是完全不必要的。每個類都可以通過聲明它並實現接口的方法來實現'TMyInterface'。不需要某種虛擬基類。 –

+0

@RudyVelthuis:在OP的代碼中,助手類「擁有許多標準方法來處理內容」,並與後代共享。我在答案中將代碼留在代碼中。 –

0

接口中聲明的所有內容都必須由該類實現。 在你的情況下,創建/銷燬似乎不需要在界面中。 Delphi中的每個類都將繼承自TObject,它已經具有Create/Destroy。

在一個接口中,你應該把這些功能擴展到實現類。

順便說一句你在Create()中放置一個Destroy嗎?

+0

我沒有把'constructor' /'destructor'聲明放入界面,請再次閱讀代碼。 – user0042

+0

ops我的錯誤我沒有正確讀取接口代碼,messigng它與實現... –

+0

@ user0042你沒有把ctor和dtor放在接口類型中,但是你確實把它們放在類聲明中的接口_section_的單位。正如Daniel _correctly_指出的那樣:根據你的實施情況,ctor和dtor不會爲你的行爲添加任何**;他們完全是多餘的。只需刪除聲明和實施。你***不需要寫出樣板代碼_at all_! –

相關問題