我有一个 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/