2011-01-27 42 views

回答

0

這本身並不是一個壞習慣。重要的是,如果可以使用與父類完全相同的函數調用的擴展類(就本接口而言)。

請參見:Liskov Substitution Principle

1

聽起來像你的問題是,如果它是確定爲實現一個接口比那些在界面實際上被定義更多方法的類?答案是肯定的,這很好,事實上也很正常。

1

在我看來,只要不暴露那些超出界面定義範圍的附加函數,這並不是一個糟糕的做法;在讓他們protectedprivate

編輯:

他在問題有標籤factory爲好。所以我認爲他正在使用factory method。因此,給定的接口實現會暴露接口中定義的更多方法會很糟糕。

0

只要他們尊重接口簽名(即根據他們的簽名實現接口方法),我發現添加其他方法的實現沒有問題。

0

一個接口是一個「服務契約」,其中一個類實現接口HAS以提供接口上描述的功能......該類可以使用不同的功能(或不是)來提供該服務,所以,它是不是一個不好的做法

0

看到類實現一個接口和其他方法是很常見的。重要的是您繼續遵守單一責任原則。也就是說,你的類的客戶端會根據它實現的接口瞭解你的對象的行爲,並且你想確保你不違反他們的期望。

0

如果您正確使用它並不是不好的做法。讓我舉一個例子。有了這些:

interface Foo { 
    public function foo(); 
} 

class Baz implements Foo { 
    public function foo() { 
     // implementation of Foo::foo() 
    } 

    public function baz() { 
     // specific to Baz 
    } 
} 

以下是窮人的做法:

function test(Foo $foo) { 
    $foo->foo(); 
    $foo->baz(); 
} 
test(new Baz); 

在PHP中,它的工作原理。在預編譯語言中,它不會。這是因爲你的論點$foo的類型爲Foo,它沒有baz方法。這將是一個編譯錯誤:編譯器檢查類型爲Foo的參數,並且Foo::baz是無效的引用。然而,那些不存在於PHP中,所以只要你傳遞一個函數Baz的對象,它就可以工作。但它打開了奇怪的運行時錯誤的大門。

的正確方法是做:

function test(Baz $foo) { 
    $foo->foo(); 
    $foo->baz(); 
} 
test(new Baz); 
相關問題