考慮下面的代碼:如何比較氧基類參考類?
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支持的任何一個平臺。
我更新的問題,以反映我試圖保持它的跨平臺兼容。就「爲什麼」而言,這實在超出了問題的範圍。我更願意回答這個問題(我自己,在這種情況下),而不是說「重寫你的代碼」。實踐總是比理論複雜得多,我認爲人們可以自己重寫代碼。就個人而言,你的解決方案似乎比我所做的更笨重,更不優雅。我無法弄清楚它會如何更好,而不僅僅是不同。 – jep
「爲什麼」很少超出範圍。如果您需要在課堂上使用虛擬行爲(本質上是跨平臺的)來實現您的需求,那麼可以減少或完全消除此類錯誤的機會,然後等級標識問題就變得沒有實際意義。依靠類身份意味着,無論您的代碼需要根據類身份改變其行爲的任何位置,每次添加新類時都需要更新,從而引入將來可能引入錯誤(遺漏)的可能性。但是你對你的方法感到滿意,這非常公平。 :) – Deltics
那麼,我遇到的地方是在我正在運行的一個調試/日誌記錄代碼塊。所以是的,很開心。 :) – jep