У меня есть лебедка абстрактного класса Runnable, представляющая сокет равноправному узлу.
Мне нужно сохранить ссылку на все сокеты, которые я создал, поэтому я решил обернуть его в класс менеджера для создания сокетов и добавьте их в список
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)
содержит ошибку, в которой говорится, что абстрактный класс не может быть создан.
Я хочу, чтобы мой менеджер не заботиться о реализации до тех пор, пока он не будет создан в приложении верхнего уровня (Main)
РЕДАКТИРОВАТЬ: Я нашел временное решение, реализующее значение по умолчанию для абстрактного метода onSocketConnected внутри SocketManager
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)
}
}
Но выглядит некрасиво и не стандартно