java - 操作抽象类而不实现

标签 java kotlin interface architecture abstract

我有一个 Runnable 抽象类 winch 代表对等点的套接字。

我必须保留我创建的所有套接字的引用,因此我选择将其包装到管理器类中以创建套接字并将它们添加到列表中

import java.util.concurrent.Executors

internal interface SocketInterface {
    fun onSocketConnected()
}

abstract class Socket(val host: String) : Runnable, SocketInterface {
    override fun run() {
        //Connected
        onSocketConnected()
    }
}

abstract class SocketManager : SocketInterface {
    private val executorService = Executors.newSingleThreadExecutor()
    var sockets = mutableListOf<Socket>()

    fun addSocket(host: String) {
        //val socket = Socket(host)
        executorService.execute(socket)
        sockets.add(socket)
    }
}

class Main {
    val manager = object : SocketManager() {
        override fun onSocketConnected() {
            //Peer connected correctly
        }
    }
    //add new socket to manager
    manager.addSocket('google.com')

}

但是这条线

//val socket = Socket(host)

错误提示无法实例化抽象类。

我希望我的经理在顶级应用程序(主)中实例化之前不关心实现

编辑: 我找到了一个临时解决方案,为 SocketManager 内的抽象方法 onSocketConnected 实现默认值

abstract class SocketManager : SocketInterface {
    private val executorService = Executors.newSingleThreadExecutor()
    var sockets = mutableListOf<Socket>()

    override fun onSocketConnected() {/* Log.d('tag', 'uglySolution'*/}

    fun addSocket(host: String) {
        //val socket = Socket(host)
        executorService.execute(socket)
        sockets.add(socket)
    }
}

但是看起来很丑,不标准

最佳答案

目前我是这样解决这个问题的。

但我认为这不是正确的方法,如果您找到任何解决方案,请告诉我。

import java.util.concurrent.Executors

abstract class Socket(val host: String) : Runnable, SocketInterface {
    override fun run() {
        onAbstractSocketConnected()
    }
}
internal interface SocketInterface {
    fun onAbstractSocketConnected()
}


abstract class SocketManager : SocketInterface, SocketManagerInterface {
    private val executorService = Executors.newSingleThreadExecutor()
    var sockets = mutableListOf<Socket>()

    fun addSocket(host: String) {
        val socket = object : Socket(host){
            override fun onAbstractSocketConnected(){
                onSocketConnected()
            }
        }
        executorService.execute(socket)
        sockets.add(socket)
    }
}
internal interface SocketManagerInterface {
    fun onSocketConnected()
}

class Main {
    val manager = object : SocketManager() {
        override fun onSocketConnected() {
            //Override now
            Log.d("DEBUG", "socket is connected")
        }
    }
    //add new socket to manager
    manager.addSocket('google.com')
}

关于java - 操作抽象类而不实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61273652/

相关文章:

arrays - Kotlin 中的多维对象数组

java - 如何将列表中的多种类型传递给函数?

go - 接口(interface)的结构嵌入, panic : runtime error

go - 如何模拟嵌套的第三方依赖项?

java - 如何使用java和jackson api获取@JsonProperty的值?

java - 使用 iText 解析 PDF 发布数据时抛出异常

kotlin - 多卡 : include code samples into package documentation

c# - 是否可以将 DataAnnotations 与接口(interface)继承一起使用?

java - Android 驱动程序 JDBC PostgreSQL

Java - 如何检查点是否在圆的切片内