2015-05-28 54 views
0

所以我一直在我的新工作,去槽的類型和他們幾乎都這個樣子爲什麼使用額外的過程來初始化值而不是在構造函數中進行?

create or replace TYPE BODY T_Some_Type AS 

    CONSTRUCTOR FUNCTION T_Some_Type 
    RETURN SELF AS RESULT AS 
    BEGIN 
    INTIALIZE(); 
    RETURN; 
    END T_Some_Type; 

    MEMBER PROCEDURE INTIALIZE AS 
    BEGIN 
    var1 := 0; 
    var2 := 0; 
    var3 := 0; 
    END INTIALIZE; 
END; 

作爲精通OOP,但新的PL/SQL,我一直在想,爲什麼使用額外的過程來初始化變量,當它可以在構造器中直接完成時,使得對象界面在內存上更簡單和更輕。 這是我通常會做到這一點:

create or replace TYPE BODY T_Some_Type AS 

    CONSTRUCTOR FUNCTION T_Some_Type 
    RETURN SELF AS RESULT AS 
    BEGIN 
    var1 := 0; 
    var2 := 0; 
    var3 := 0; 

    RETURN; 
    END T_Some_Type; 
END; 

它有什麼優勢或者這個建議由於某種原因? 請指教。

+0

也許他們希望能夠通過調用'initialize'來重新初始化對象? –

+0

我不能通過將對象設置爲新對象來再次調用構造器代碼?就像我第一次初始化它? –

回答

1

請注意,自8.0版本以來,Oracle中的對象功能發展緩慢,但在某些方面仍然相當有限。這是因爲Oracle是一個具有結構化和程序化編程範式的關係數據庫:面向對象並不適合。

所以。在像Java這樣的語言中,我們可以重寫子類型的方法,但可以通過調用super()來執行父代實現中的代碼。

11g之前Oracle沒有類似的擴展成員函數的機制。如果我們想要重寫一個超類型的方法,我們不得不復制子類型的代碼,這很不合適。有一個解決方法是naff:在超類型中將通用代碼提取到單獨的方法中,並在超類型及其依賴項中調用該方法。

在Oracle 11g中引入了「通用調用」。這使我們可以調用子類型的超級類型代碼。 Find out more。廣義調用有一個主要限制,那就是我們不能在構造函數方法中使用它。因此,在它的子類型的構造函數中,我們唯一的選擇是在你的問題中使用如initialize()這樣的方法。

+0

我不能通過將對象設置爲新對象來再次調用構造器代碼?就像我第一次初始化它 –

相關問題