java - 如何在接口(interface)隔离上实现 SOLID

标签 java kotlin coding-style solid-principles

我有一个 interface像这样 :

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

但是当在一个类上实现它时,我只需要 onClientNeeded有什么办法可以避免重写这两种方法?
我试图创建另一个接口(interface)来扩展那个接口(interface),但仍然要求我实现这些方法..

澄清

我正在使用一个外部库,它使用这两种方法的接口(interface),问题是我使用它的地方我只需要一种方法而不是两种方法,而不是让覆盖做任何我只想知道的事情避免我不需要的额外覆盖的方法。

编辑
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而不是他们两个。

最佳答案

您可以在此处通过几个选项进行更改:

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)或者您可以按原样使用此接口(interface)并每次都提供一个空实现:)

编辑

在您的具体情况下,您可以添加类 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是需要的。

关于java - 如何在接口(interface)隔离上实现 SOLID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60812197/

相关文章:

c# - Resharper 正确吗?

Java - 在 getter 方法中克隆属性

java - 成员变量是否像对象的特性?

android - 如何在 Jetpack Compose 中正确使用 StateFlow?

refactoring - 如何说服同事代码重复不好?

python - 如何在 Kotlin 中正确反转链表?

java - 如何使用它的片段使RelativeLayout 可滚动? - Kotlin

java - 有没有API可以克隆Android Market应用程序的行为?有可能吗?

java - postDelayed 有时无法在 Android 中运行

java - 如何制作具有以下签名 '(x OR y) AND z'的spring data自定义查询方法