2011-03-10 26 views
17

我有這些類和過程:如何確定一個Delphi對象是否具有特定的類而不是任何後代類?

TParent = class(TObject); 
TChild1 = class(TParent);  
TChild2 = class(TParent); 

Procedure DoSomething(obj:TParent); 

我想要做的是,當objTParent,而不是一個後代引發異常。

我想過做這樣的事情:

if obj.classname = TParent.classname then raise exception.create.... 

,但它似乎有點的hackish(TM)

更多:是我的本意是爲了能夠通過該共享屬性的對象/共同的程序。經過深思熟慮,TParent對象根本不需要,我需要的是我的答案中顯示的接口對象。

+0

從已經給出的答案公寓,當然有有效的情況下想要這個,但沒有那麼多。你爲什麼需要知道? – 2011-03-10 07:05:23

+4

+1因爲認爲這是一個黑客。作爲一個經驗法則,如果你用* strings *做類型相關的事情,你可能做錯了什麼。 – 2011-03-10 08:02:10

回答

0

我認爲我解決了我想要做的事情,它昨晚打我的頭。

iParentInterface = interface(IUnknown); 
TChild1 = class(TInterfacedObject,iParentInterface);  
TChild2 = class(TInterfacedObject,iParentInterface); 

Procedure DoSomething(obj:iParentInterface); 
11

你在正確的軌道上,但不是比較類名,而是檢查ClassType屬性更簡單。

if obj.ClassType = TParent then raise exception.create.... 
+5

不僅更簡單,而且*更正確*。兩個班可能有相同的名字,但不能是同一班。 ('ClassName'函數不包含單元名稱,否則會區分類命名的類。不知道它對嵌套類有什麼作用。) – 2011-03-10 07:55:26

+2

@Rob它很明顯:'TOuter.TInner'。 – 2011-03-11 00:49:31

+1

文檔說應該使用關鍵字* is *而不是按ClassType進行比較。 – StanE 2015-01-24 23:26:16

30

你可能會發現以下TObject類方法有用:

  • ClassType - 返回對象的類
  • ClassParent的 - 給人的父類的類
  • InheritsFrom的 - 返回一個類是否從另一個類繼承(即,檢查整個繼承鏈)。它包括當前課程。

所以,你可以達到你想要的東西(從TParent下降,但不TDescendant?)的東西,如下面的代碼(未經測試,沒有德爾福在這一刻):

if obj.ClassType.InheritsFrom(TParent) 
    and not obj.ClassType.InheritsFrom(TDescendant) then... 

或者如果我誤解,你只是想看看如果對象是一個TParent,並沒有任何一種的後代在所有嘗試:

if obj.ClassType = TParent then... 

德爾福遙遙領先其時間通過提供接入類metaclasses,所以寧可只需檢查類名稱即可訪問實際的類對象。

+2

也許會過時,但仍然落後於Smalltalk! – 2011-03-10 11:24:10

+0

是的,我很想在我的回答中添加一個Smalltalk評論:) – 2011-03-10 22:40:22

2

另一種方法:在TParent中引入抽象方法,如CheckValidChild,並在子類中重寫它。現在,當您撥打obj.CheckValidChild時,如果obj的實例屬於TParent類,您將收到EAbstractError

11

面向對象編程的良好實踐表明,不應該這樣做。你所描述是直接違反了Liskov substitution principle,其中規定:在程序

對象應該 更換他們的 亞型的情況下,不改變 正確性該程序

我的認爲你應該解釋你試圖解決什麼問題,然後一個更好的方法可能會變得明顯。

+0

Liskov SP的+1。 – 2011-03-10 21:25:57

+2

這是我需要的微調, – 2011-03-11 00:34:41

相關問題