如何在接口隔离上实现 SOLID

How to implement SOLID on an interface segregation

我有一个 interface 这样的:

interface ClientRequestListener {
    fun onLoadStub(name: String)
    fun onClientNeeded(id: String, email: String)
}

但是当在一个 class 上实现它时,我只需要 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 而不是两者都调用。

您必须在抽象 class 中提供 onLoadStub 方法的实现。该实现应该简单地抛出 UnsupportedOperationException。然后,您可以在您的实现中扩展该抽象 class。

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) 您可以创建一个抽象 class,它将提供不需要的方法的默认(空)实现,并强制您只覆盖您感兴趣的方法:

abstract class AbsClientRequestListener {
    override fun onLoadStub(name: String) {
    }
    abstract fun onClientNeeded(id: String, email: String)
}

b) 如果你有一个 classes 的层次结构,你可以在你的基础 class 中提供一个默认实现,并为子 class 保留 onClientNeeded 未实现es:

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) 或者你可以按原样使用这个接口,每次都提供一个空的实现:)

编辑

在您的具体情况下,您可以添加 class 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