Java 如何在接口上实现实体隔离

Java 如何在接口上实现实体隔离,java,kotlin,coding-style,solid-principles,Java,Kotlin,Coding Style,Solid Principles,我有一个界面,如下所示: interface ClientRequestListener { fun onLoadStub(name: String) fun onClientNeeded(id: String, email: String) } doSomeMagic("Charls", object : ClientRequestListener { override fun onClientNeeded(name: String) { //I'm not do

我有一个
界面
,如下所示:

interface ClientRequestListener {
    fun onLoadStub(name: String)
    fun onClientNeeded(id: String, email: String)
}
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
  }
})
但是,当在一个类上实现它时,我只需要
onclientneedd
有没有办法避免重写这两个方法? 我试图创建另一个扩展该接口的接口,但仍然要求我实现这些方法

澄清 我在使用一个外部库,它使用一个与这两个方法的接口,我在使用它的地方,我只需要一个方法,而不是两个方法,我不想让重写做任何事情,我只是想知道一种方法来避免我不需要的额外重写

编辑 所以当我使用这种方法时,我会这样做:

interface ClientRequestListener {
    fun onLoadStub(name: String)
    fun onClientNeeded(id: String, email: String)
}
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
  }
})

因此,我想做的是在需要客户端时只调用
,而不是同时调用它们。

必须在abastract类中为onLoadStub方法提供一个实现。这种暗示应该只是抛出一个不支持的操作异常。然后可以在实现中扩展该抽象类

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

编辑

在您的特定情况下,您可以添加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
进行任何更改。

您可以将每个方法添加到单独的接口中,并让您的类仅使用
onClientNeeded实现接口。问题是我使用的库需要这两种方法,但就在某些地方,我想使用
onclientneedd
,因为另一个方法对我没有用处,所以必须在abastract类中为
onLoadStub
方法提供一个实现。该实现只需抛出一个
不支持操作异常
。然后你可以在你的实现中扩展这个抽象类。如果你想,你可以发布一个答案,这样我就可以测试它,并将你的答案标记为正确的,以防它起作用。你能添加一个简单的例子吗?编辑了我的评论,还添加了一个关于我的问题的代码,这样你们就可以更好地理解我的问题,你现在明白了吗?我在寻找选项2,你能举个例子吗?我只是在寻找完全相同的方法,使用一个接口,只使用这些接口的一个方法,这就是为什么我只为该方法创建了一个BaseClientinterface,但编译器告诉我必须重写所有方法。。你能为选项2提供一个例子吗?@StuartDTO,添加了一个简短的层次结构作为例子。还添加了一个代码,对我的问题进行了删节,这样你们就可以更好地理解我的问题,现在明白了吗?@StuartDTO,我明白了。在我的帖子中添加了一个编辑。这对你现在有意义吗?嗯,是的,至少它没有抱怨,但你认为这是一个可靠的解决方案吗?