2013-02-20 75 views
2

FrameworkA消耗了一個FrameworkA.StandardLogger類用於記錄。我想用另一個替換日誌庫(SuperLogger類)。檢查一個類是否在運行時實現了一個接口

要做到這一點,有接口FrameworkA將提供一個FrameworkA.Logger接口,其他庫必須實現。

但是,如果其他庫不實現該接口呢? FrameworkA可能是一個不夠流行的框架,使得SuperLogger關心其界面。

可能的解決方案是:

  • 有一個標準化的接口(由JSR一樣,PSR標準定義,...)
  • 寫適配器

如果什麼也沒有標準化的接口,你想避免編寫無用的適配器的痛苦,如果類是兼容的?

難道沒有另一種解決方案來確保類滿足合同,但在運行時?

想象(僞代碼非常簡單的實現):

namespace FrameworkA; 
interface Logger { 
    void log(message); 
} 

namespace SuperLoggingLibrary; 
class SupperLogger { 
    void log(message) { 
     // ... 
    } 
} 

SupperLoggerLogger兼容,只要它實現的記錄器接口。但是,而不必FrameworkA.Logger「硬的依賴」,其公開的「接口」(或簽字),可以在運行時驗證:

// Something verify that SupperLogger implements Logger at run-time 
Logger logger = new SupperLogger(); 

// setLogger() expect Logger, all works 
myFrameworkAConfiguration.setLogger(logger); 

在假的情況下,我預計Logger logger = new SupperLogger()在運行時失敗如果該類與接口不兼容,但如果它是成功的話。


這是在OOP中的一個有效的東西嗎?如果是,它是否以任何語言存在?如果不是,爲什麼它是無效的?

我的問題代表靜態類型語言(Java,...)或動態類型語言(PHP,...)。對於PHP & al:我知道什麼時候沒有類型檢查你可以使用任何你想要的對象,即使它沒有實現接口,但我會感興趣的東西,實際上檢查對象符合與界面。

+0

我也在尋找這種類型系統的語言,但我想你的意思是編譯時,而不是運行時,因爲對於運行時你幾乎可以爲任何語言編寫代碼來檢查方法'可用性和簽名,並且如果它們不匹配會引發異常。 – user 2016-02-28 18:55:51

回答

1

這就是所謂的鴨打字,您將在紅寶石(「它走起來像鴨子,那麼它叫起來像鴨子,那麼它一定是鴨子」)

在其他動態語言找到一個概念你可以模擬它,例如使用method_exists。在靜態類型語言中可能會有反射的解決方法,搜索「鴨子打字+語言」將有助於找到它們。

+0

啊謝謝你創造這個詞!不過,我正在談論更嚴格的「鴨子打字」:如果對象與界面不兼容,則失敗。而問題是動態類型化語言不會讓你定義「接口」,或者如果他們這樣做,那麼變得靜態類型,你不能做鴨子打字(例如PHP有時可以靜態類型)。所以最後,靜態類型將不允許它,動態類型將允許*任何*。我想允許*任何與界面X兼容的東西* – 2013-02-20 12:56:24

0

與OOP相比,這更像是一個靜態類型的問題。Java和Ruby都是面向對象的語言,但Java可以允許你想要的東西(就像它的靜態類型),但是Ruby會(如同它的動態類型一樣)。

從靜態類型語言的角度來看,主要的(如果不是主要的)優勢之一是在編譯時知道賦值是否安全有效。你正在尋找的是動態類型語言(比如Ruby)提供的,但不是靜態類型語言中可能的 - 這是設計(編譯時安全)。

你可以,但它是醜陋的,這樣做(在Java中):

Object objLogger = new SupperLogger(); 
Logger logger = (Logger)objLogger; 

這將通過在編譯時間,但如果轉讓無效會在運行時失敗。這就是說,以上是相當醜陋,我不會做的事情 - 它不會給你太多,並在運行時冒着不愉快(並可能是令人驚訝)的異常。

我想你可以希望在Java等語言將是抽象的創作遠離那些你想使用它的最好:

Logger logger = getLogger(); 

隨着getLogger決定要返回內部。然而,這只是將實際創作推遲至更低 - 您仍然必須以靜態類型的安全方式進行。

+0

只需添加.Net即使靜態鍵入一些聰明的反射也可以讓你做到這一點 - 但是你很大程度上放棄了靜態類型而沒有獲得好處的好處那些動態輸入 – Basic 2013-02-20 12:14:37

+0

有趣 - 我必須看看那個:-) – 2013-02-20 12:24:21

相關問題