簡體   English   中英

如何在接口隔離上實現 SOLID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM