2013-10-13 30 views
0

考慮下面的代碼:如何比較氧基類參考類?

type 
    Class1 = public class 
    end; 

    Class1Class = class of Class1; 

    Class2 = public class (Class1) 
    end; 

    Class3 = public class (Class1) 
    end; 

    Class4 = public class 
    public 
    method DoSomething(c: Class1Class): Integer; 
    end; 

implementation 

method Class4.DoSomething(c: Class1Class): Integer; 
begin 
    if c = Class2 then 
    result := 0 
    else if c = Class3 then 
    result := 1 
    else 
    result := 2; 
end; 

應該如何DoSomething實際上寫的,作爲平等的比較拋出編譯器錯誤: Type mismatch, cannot find operator to evaluate "class of Class1" = "<type>"

使用is編譯,但實際上第一個條件始終計算爲true無論是Class2還是Class3都通過了。

目標是以跨平臺的方式編寫而不使用cod e特定於Oxygene支持的任何一個平臺。

回答

0

您必須爲條件中使用的每個類創建類引用,並使用is運算符。

type 
    Class1 = public class 
    end; 

    Class1Class = class of Class1; 

    Class2 = public class (Class1) 
    end; 

    Class3 = public class (Class1) 
    end; 

    Class4 = public class 
    public 
    method DoSomething(c: Class1Class): Integer; 
    end; 

    Class2Class = class of Class2; 
    Class3Class = class of Class3; 

implementation 


method Class4.DoSomething(c: Class1Class): Integer; 
begin 
    if c is Class2Class then 
    result := 0 
    else if c is Class3Class then 
    result := 1 
    else 
    result := 2; 
end; 
0

我不知道爲什麼你是專門測試的類型 - 如果你是虛擬化通過類引用的類的行爲,但假設你有需要帶班工作原因部份不應該是必要的的一類基準身份......

你不說你正在哪個平臺上,但在Java中的Java類類型工作得很好出於這些目的,而無需使用OXYGENE類引用:

method Class4.DoSomething(c: &Class<Object>): Integer; 
begin 
    case c of 
    typeOf(Class2): result := 0; 
    typeOf(Class3): result := 1; 
    else 
    result := 2; 
    end; 
end; 


// Examples of usage: 

c4.DoSomething(typeOf(Class1)); 

someC := new Class3; 
c4.DoSomething(someC.Class); 

如果你是工作Java或需要一個平臺移植的方法,那麼你可以在使用虛擬類方法的類包括一個備用階級身份:

Class1 = public class 
    class method classID: Integer; virtual; 
    end; 

實現此返回某個常數確定Class1的。覆蓋後代類以爲每個類返回適當的ID。然後在你的DoSomething的方法:

method Class4.DoSomething(c: Class1Class): Integer; 
begin 
    case c.classID of 
    CLASS_2: result := 0; 
    CLASS_3: result := 1; 
    else 
    result := 2; 
    end; 
end; 
+0

我更新的問題,以反映我試圖保持它的跨平臺兼容。就「爲什麼」而言,這實在超出了問題的範圍。我更願意回答這個問題(我自己,在這種情況下),而不是說「重寫你的代碼」。實踐總是比理論複雜得多,我認爲人們可以自己重寫代碼。就個人而言,你的解決方案似乎比我所做的更笨重,更不優雅。我無法弄清楚它會如何更好,而不僅僅是不同。 – jep

+0

「爲什麼」很少超出範圍。如果您需要在課堂上使用虛擬行爲(本質上是跨平臺的)來實現您的需求,那麼可以減少或完全消除此類錯誤的機會,然後等級標識問題就變得沒有實際意義。依靠類身份意味着,無論您的代碼需要根據類身份改變其行爲的任何位置,每次添加新類時都需要更新,從而引入將來可能引入錯誤(遺漏)的可能性。但是你對你的方法感到滿意,這非常公平。 :) – Deltics

+0

那麼,我遇到的地方是在我正在運行的一個調試/日誌記錄代碼塊。所以是的,很開心。 :) – jep