[英]How to implement SOLID on an interface segregation
我有一個這樣的interface
:
interface ClientRequestListener {
fun onLoadStub(name: String)
fun onClientNeeded(id: String, email: String)
}
但是當在一個類上實現它時,我只需要onClientNeeded
有什么方法可以避免必須覆蓋這兩個方法? 我試圖創建另一個接口來擴展那個接口,但仍然要求我實現這些方法..
我正在使用一個外部庫,它使用一個帶有這兩種方法的接口,問題是我使用它的地方我只需要一種方法而不是兩種方法,而不是覆蓋做任何事情,我只想知道一個避免我不需要的額外覆蓋的方法。
fun doSomeMagic(name: String, clientRequestListener: ClientRequestListener? = null) =
LibraryRequest.getClient(name)
.withListener(object : LibraryInterface() {
override fun onLoadStub(name: String) {
clientRequestListener?.onLoadStub(name)
}
override fun onClientNeeded(id: String, email: String) {
clientRequestListener?.onClientNeeded(id, email)
}
})
所以當我使用這種方法時,我會做這樣的事情:
doSomeMagic("Charls", object : ClientRequestListener {
override fun onClientNeeded(name: String) {
//I'm not doing nothing here
}
override fun onClientNeeded(id: String, email: String) {
//Do something with the id and email
}
})
所以我想做的是只onClientNeeded
那里調用onClientNeeded
而不是兩者。
您必須在抽象類中為 onLoadStub 方法提供一個實現。 該實現應該簡單地拋出一個 UnsupportedOperationException。 然后,您可以在您的實現中擴展該抽象類。
abstract class AbstractClientRequestListener : ClientRequestListener {
override fun onLoadStub(name: String) {
throw UnsupportedOperationException("unsupported")
}
}
class ClientRequestListenerImpl : AbstractClientRequestListener() {
override fun onClientNeeded(id: String, email: String) {
TODO("not implemented")
}
}
您可以在此處通過多個選項更改內容:
a)您可以創建一個抽象類,該類將提供不需要的方法的默認(空)實現,並強制您僅覆蓋您感興趣的方法:
abstract class AbsClientRequestListener {
override fun onLoadStub(name: String) {
}
abstract fun onClientNeeded(id: String, email: String)
}
b) 如果你有一個類的層次結構,你可以在你的基類中提供一個默認的實現,並為子類保留onClientNeeded
未實現:
interface ClientRequestListener {
fun onLoadStub(name: String)
fun onClientNeeded(id: String, email: String)
}
abstract class BaseClient: ClientRequestListener {
override fun onLoadStub(name: String) {
// Leave empty
}
}
class Client:BaseClient() {
override fun onClientNeeded(id: String, email: String) {
// Put required implementation
}
}
c) 或者您可以按原樣使用此接口並每次都提供一個空的實現:)
編輯
在您的特定情況下,您可以添加類ClientRequestListenerAdapter
:
abstract class ClientRequestListenerAdapter : ClientRequestListener {
override fun onLoadStub(name: String) {
}
}
並像這樣使用它:
doSomeMagic("Charls", object : ClientRequestListenerAdapter {
override fun onClientNeeded(id: String, email: String) {
//Do something with the id and email
}
})
不需要更改函數doMagic
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.