我有一個用於驗證數據庫中數據的接口,它的實現可以通過查找和檢查功能來做不同的事情。一些實現需要額外的功能才能完成他們的任務,這是否是一種不好的做法?向PHP中的接口中沒有定義的實現添加其他方法是不是很差勁?
2
A
回答
0
這本身並不是一個壞習慣。重要的是,如果可以使用與父類完全相同的函數調用的擴展類(就本接口而言)。
1
聽起來像你的問題是,如果它是確定爲實現一個接口比那些在界面實際上被定義更多方法的類?答案是肯定的,這很好,事實上也很正常。
1
在我看來,只要不暴露那些超出界面定義範圍的附加函數,這並不是一個糟糕的做法;在讓他們protected
或private
編輯:
他在問題有標籤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);
相關問題
- 1. 調用方法沒有在Java中實現的接口的接口中定義
- 2. 向實現接口的所有類添加一個方法
- 3. BindingList <T>其中T是實現其他接口的接口
- 4. 訪問其他類中實現的接口方法
- 5. 找出(upcast)實例是否沒有實現特定接口的最佳方法
- 6. 只有沒有其他方法實現接口的類可以嗎?
- 7. 泛型方法,其中T是列表實現接口
- 8. C#接口 - 僅實現其他接口中的接口
- 9. Assembly.GetTypes()不會返回實現在其他地方定義的接口的類型
- 10. 有沒有在intellij中實現接口方法的捷徑?
- 11. PHP調用其他類中的方法是不是
- 12. 向接口添加新方法的方式不會影響java6中此接口的現有子類?
- 13. Java中的ArrayList沒有實現Collection接口的方法?
- 14. Java中的枚舉不允許在其實現接口中實現方法
- 15. 在「添加未實現的方法」接口中導入註釋
- 16. 有沒有辦法在Ruby中強制實現接口方法?
- 17. 如何在JRuby中定義Java接口而不是實現它?
- 18. 在Ruby中爲類名使用全部大寫是不是很差勁?
- 19. 是否有可能不實現從C#中的接口繼承的方法?
- 20. 擴展一個類(實現接口)並實現相同的接口不需要類中的方法定義?
- 21. java實現與其他方法的接口
- 22. 我的類實現與方法的接口。沒有實現,但沒有錯誤
- 23. 是否有實現addActionListener方法的對象的Java接口?
- 24. 定義接口中的類實現
- 25. 實現定義的接口
- 26. 說法是法實現的接口
- 27. Hashtable是否實現Map接口中的每個方法?
- 28. 向接口添加額外的方法
- 29. IntelliJ是否可以將@Overrrides添加到特定接口的所有方法中?
- 30. 如何發現子類中的方法(參數)是否在已實現的接口中定義了註釋?
是其他方法公營或私營/保護? – 2011-01-27 16:14:00
它們是公開的 – 2011-01-27 16:14:24