Манипулирование абстрактным классом без реализации - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть лебедка абстрактного класса 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)
    }
}

Но выглядит некрасиво и не стандартно

1 Ответ

0 голосов
/ 23 апреля 2020

На данный момент я решаю проблему следующим образом.

Но я не думаю, что это правильный путь, дайте мне знать, если вы нашли какое-либо решение.

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')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...