2016-11-13 49 views
0

在埃菲爾中,如果比較擴展類型的對象,=運算符會逐字段比較它們,檢查兩個對象中每個字段的內容是否相同。Eiffel:沒有字段的擴展類是`=`還是不是?

讓我們想象一下兩片展開的班,沒有在他們定義的特徵:

expanded class A 
end 

expanded class B 
end 

如何艾菲爾告訴他們分開?或者不可以嗎?它是否與從ANY繼承的某個或某些字段有關?

both_are_equal: BOOLEAN 
    local 
     a: expanded A 
     b: expanded B 
    do 
     Result := a = b 
    end 

回答

1

只有當兩個對象的類型相同時才應用逐字段比較。如果它們屬於不同類型,則平等運算符會給出錯誤。換句話說,對於擴展類型的相等運算=與語義

type_of (a) = type_of (b) and then a.is_equal (b) 

等同於相等運算~因此both_are_equal會給False

結果將是相同的,如果代替a和擴大類型的b會有x並連接到擴展對象引用類型的y - 比較需要類型的對象的考慮:

both_are_equal: BOOLEAN 
    local 
     a: expanded A 
     b: expanded B 
     x: ANY 
     y: ANY 
    do 
     x := a 
     y := b 
     Result := x = y -- Gives False 
    end 

但如果參考表達式附加到相同類型的展開對象,則使用逐場比較,而不是參考相等:

both_are_equal: BOOLEAN 
    local 
     a: expanded A 
     b: expanded A -- Note the type change 
     x: ANY 
     y: ANY 
    do 
     x := a 
     y := b 
     Result := x = y -- Gives True even though x and y are different objects 
    end 

某些d平等運營商的詳細信息可在Standard ECMA-367(第8.21節)和ANY類中的特定比較功能合同中找到。

+0

謝謝你的回答!你可以請添加一個鏈接到一些文件,以進一步閱讀? – g4v3

+0

@ g4v3,我在答案的最後添加了幾個鏈接。目前該標準有點過時,但要點仍然有效。到ANY類的源代碼的鏈接是完全最新的。 –