インターフェイスの分離にSOLID実装する方法

StuartDTO:

私は持っているinterface。このように:

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

一つのクラスでそれを実装する場合しかし、その後、私はちょうど必要とするonClientNeededこれらの2つのメソッドをオーバーライドすることを避けるためにどのような方法がありますか?私は1つを拡張する別のインタフェースを作成しようとしましたが、それでもメソッドを実装するために私を求めてきました。..

明確化

私はこれらの2つの方法とのインタフェースを使用する外部ライブラリを、使用している、との事は私がだけではなく、両方のいずれかの方法を必要とし、代わりに私は知りたいと思った何もしてオーバーライドを有するので、これを使用しているところであります方法は、私は必要がないということは、余分なオーバーライドを避けるために。

EDIT

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)
}

あなたはクラスのhierarachyを持っている場合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)それとも、ただであるとして、このインターフェイスを使用して、空の実装を毎回提供することができます:)

EDIT

あなたの特定のケースでは、クラスを追加することができます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必要ありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=349794&siteId=1