2010-08-25 24 views
4

我有一套對象,我想符合一個接口,說ISpecialObject。 然而,我想要在每個ISpecialObject的實現中封裝這些特殊對象的實例化觸發器。無法將靜態方法指定爲接口的一部分?

所以說例如我有作爲實現ISpecialObject的類類型列表,然後我想要通過每一個,並調用一個像CanCreate(一些數據),它告訴我是否創建一個實例的靜態方法這些。

但是,.net似乎沒有讓我指定這個靜態CanCreate作爲ISpecialObject接口的一部分。

任何人都可以提出一種方法來解決這個問題,或者更好的方法來解決這些對象的實例化封裝的問題?我可能只是在想這一切都是錯誤的。

謝謝。

編輯:我可能已經說了這個很糟糕的一些部分。我不想在接口中提供實現,而是指定將會有一個,並且它將是靜態的。本質上,我希望通過允許更高級別的對象查詢何時在運行時創建它們來自定義對象。

回答

2

.NET不允許在接口上進行靜態方法聲明。他們並沒有什麼意義,因爲接口都是關於合同的,並且完全避免執行。靜態方法具體關於實現。此外,接口方法根據實例的類型是虛函數調用,而靜態方法獨立於實例甚至類(它們可以放在任何具體類型上)。

如果你有很多ISpecialObject的實現,你可以使用工廠模式。爲了做到這一點,你需要定義定義一個名爲ISpecialObjectFactory接口旁邊ISpecialObject

class ISpecialObjectFactory 
{ 
    ISpecialObject CreateInstance(...); 
    bool CanCreate(...); 
} 

每一個實現ISpecialObject類應該有一個相應的ISpecialObjectFactory(例如UserObject本來也有UserObjectFactory)。這需要更多的代碼,但這是一種常見的模式,我相信它可以解決您的問題。

+0

我討厭這個工廠模式,我更喜歡屬性。 – leppie 2010-08-25 05:15:12

+0

我不是工廠的狂熱粉絲,但不會靜態決定屬性嗎?如果'CanCreate'取決於運行時間因素怎麼辦?此外,還涉及到反思,儘管您可以將其削減爲一次性成本。我希望看到更多你的意思。 – 2010-08-25 05:19:24

+0

@Chris Schmich:查看任何.NET IoC庫。對於自定義行爲,你總是可以稱呼(咳嗽)工廠。 :) – leppie 2010-08-25 05:21:06

1

我沒看到這個問題。處理靜態方法時,typename只是一個前綴。如果靜態方法存在於其他地方,那麼它將沒有什麼區別。

這就是說,看看擴展方法,這可能確實希望你真的希望它:)

編輯:另一種選擇可能是使用屬性。

3

從我的理解,你的主要問題是一組符合相同接口的對象的實例化。如果是這樣,你可能想看看Factory Design Pattern這是封裝這種邏輯的標準方式。

1

我們剛剛在另一個線程上討論了與此類似的東西。 擴展方法絕對是解決這個問題的一種方法。它們可以爲接口提供實現,並且可以將這些方法視爲靜態或用作正在擴展的對象實例的方法。

這不完全是你說過這個問題的方式的重複,但它在本質上是重複的,所以請查看下面的鏈接。

StackOverflow - subclass-needs-to-implement-interface-property-as-static

+0

不完全。擴展方法仍然需要該對象的一個​​實例。問題在於詢問靜態方法。 – 2010-08-25 05:49:22

0

也許你可以使用一個抽象類作爲超類爲你的目的。所以靜態方法進入抽象類,所有派生類也都有。不過,我同意上面可能使用工廠模式的帖子在這裏是一個更好的方法。