我在Delphi XE中編寫了這個代碼,它從GUID const分配接口的GUID。代碼編譯好,但我想知道這是否是一個有效的聲明?關於爲接口分配GUID的問題
const
IID_IFoo: TGUID = '{00000000-6666-6666-6666-666666666666}';
type
IFoo = interface(IDispatch)
[IID_IFoo]
//properties
//methods
end;
我在Delphi XE中編寫了這個代碼,它從GUID const分配接口的GUID。代碼編譯好,但我想知道這是否是一個有效的聲明?關於爲接口分配GUID的問題
const
IID_IFoo: TGUID = '{00000000-6666-6666-6666-666666666666}';
type
IFoo = interface(IDispatch)
[IID_IFoo]
//properties
//methods
end;
你可以做到這一點,但問題是爲什麼你想?
如果您希望引用接口的GUID而不是接口的名稱,那麼只要該接口具有關聯的IID(GUID),那麼可以使用TGUID所在的接口名稱:
type
IFoo = interface(IDispatch)
['{00000000-6666-6666-6666-666666666666}']
//properties
//methods
end;
// meanwhile, elsewhere in the project...
sFooIID := GUIDToString(IFoo);
這是接口的少「嘈雜」的宣言,並避免了可能會聲明/引用IID常數實際上未與接口有關的,你認爲這是可能的(或沒有被與IID完全相關)。
const
IID_Foo = '{00000000-6666-6666-6666-666666666666}';
IID_Bar = '{00000000-6666-6666-6666-777777777777}';
type
IFoo = interface(IDispatch)
[IID_Bar] // WHOOPS!
:
end;
IBar = interface(IDispatch)
// WHOOPS again!!
:
end;
// Meanwhile, elsewhere in the project
sBarID := GUIDToString(IID_Bar); // Works, but is the IID of IFoo, not IBar
sFooID := GUIDToString(IID_Foo); // Works, but is an IID not associated with any interface
使用接口本身既是接口和 IID,而不是具有單獨的常量聲明,消除了這些錯誤的可能性。
當使用單獨的常量的聲明IID的 - 如果你絕對要 - 你可以通過使用接口從未最更小,其中預計IID的對這些問題的一個保護。但是,這無疑使事情在錯誤的IID已被用於特定接口的情況更糟:
// Cannot make the mistake of using an interface as a GUID if it has no IID at all
sBarID := GUIDToString(IBar); // Does not compile - IBar has no IID
// But if it's the wrong IID then you get results that are "correct" but not expected:
a := GUIDToString(IFoo);
b := GUIDToString(IID_Foo);
a <> b
我看不出你認爲那樣嚴重的危險,但我確實認爲將IID內聯爲文字更具慣用性。 –
這是你看不到的危險,通常會把你趕出去。 ;) (但是請注意,可能更難得一遇的危險比真正的高風險 - 即使是這樣,爲什麼引進了這種危險的可能性時,有沒有必要) – Deltics
@Deltics原因之一申報GUID常數獨立於界面如圖Delphi的一個解決方法不允許你聲明一個接口類型的常量。請參閱[本問答](http://stackoverflow.com/a/704645/224704)。 –