2017-08-14 88 views
1

我是新來緩存,發現了一些不同於正常的oop概念。在對象腳本中,基類可以從多個子類繼承(繼承順序可以是左/右)。如果objectscript是oop,我不知道緩存如何支持這個(不太可能用其他編程語言)。對象腳本是否支持多重繼承?

BaseClass的

Class Inheritance.TheBaseClass Extends (%RegisteredObject, 
    Inheritance.TheChildClass, Inheritance.TheChildClass1) [ Inheritance = left ] 
    { 
    ClassMethod Init() 
    { 
     //do ##class(Inheritance.TheChildClass).Ping() 
     //do ##class(Inheritance.TheChildClass1).Ping() 
     do ..Ping() 
     do ..Pingggg() 
     } 

    } 

子類1

Class Inheritance.TheChildClass Extends %RegisteredObject 
{ 

    ClassMethod Ping() 
    { 
     Write "I am in Inheritance.TheChildClass",! 
    } 

} 

子類2

Class Inheritance.TheChildClass1 Extends %RegisteredObject 
{ 

    ClassMethod Ping() 
    { 
    Write "I am in Inheritance.TheChildClass1",! 
    } 

    ClassMethod Pingggg() 
    { 
    Write "I am in Inheritance.TheChildClass1111111111",! 
    } 

    } 

輸出

我在Inheritance.TheChildClass

我在Inheritance.TheChildClass1111111111

+2

那麼,什麼問題?至於我,你已經回答了你的問題,你需要更多。唯一奇怪的是,你如何命名你的類。你必須有兩個類,你命名爲ChildClass和一個是BaseClass的繼承類。 – DAiMor

+0

@DAiMor我的問題是最後一句「我不知道緩存如何支持這個(不太可能用其他編程語言)」。 –

+0

你是什麼意思?下面發佈的「緩存如何支持這個」是文檔中的大量解釋,除此之外,你還有什麼問題嗎? – kazamatzuri

回答

3

文檔解釋了這分明: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_classes#GOBJ_classes_inheritance

例如,如果類X繼承自類A,B和C,其定義在cludes:

Class X Extends (A, B, C) 
{ 
} 

默認繼承順序的類編譯器從左至右,這意味着在超類中的成員定義的差異有利於最左邊超類的被解決(在這種情況下,A替代的B和C ,並且B取代C.)

具體而言,對於類X,類參數值,屬性和方法的值從類A(列出的第一個超類)繼承,然後從類B繼承,最後,從X類繼承.X還繼承A中沒有定義的B中的任何類成員,以及C中A和B都未定義的類成員。如果B類擁有一個與已經從A繼承的成員具有相同名稱的類成員,那麼X使用來自A的值;同樣,如果C具有與從A或B繼承的名稱相同的成員,則優先順序爲A,然後是B,然後是C.