Как добавить внешние вызываемые функции-члены к анонимному объекту? - PullRequest
0 голосов
/ 03 июля 2018

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

Что я спрашиваю:

Как я могу добавить функцию-член в анонимный объект, который вызывается вне этого объекта? Или это требование слишком странное, что не должно быть реализовано?

Рассмотрим это выражение объекта ниже:

variable = object : AClass()
{
    // inside the declaration of anonymous object

    override fun aFunction(i: Int)
    {
        // do something inside aFunction
    }
}.apply {
    // do something inside apply
}

Как добавить функцию fun bFunction(i: Int), которая , просто принадлежит variable, , а не , принадлежит AClass, которую можно вызывать, напрямую используя

variable.bFunction(1)

? Или это невозможно сделать?

То, что я пробовал (и, конечно, не удовлетворяю то, что хочу):

  • Я могу создать функцию расширения fun AClass.bFunction(i: Int) для ее решения, однако это может быть «несправедливо» по отношению к другому экземпляру AClass, поскольку им это на самом деле не нужно.
  • Я могу создать класс вместо локального использования анонимного объекта, однако создать класс для ОДНОЙ переменной кажется слишком тяжелым.
  • Я попытался добавить bFunction в объявлении анонимного объекта, где позиция упоминается выше. Однако я могу получить доступ только к этой функции внутри .apply {}, но не вне этого назначения.
  • Я попытался добавить bFunction внутри .apply {}, но это также заставило меня просто получить к нему доступ внутри .apply {}, а не вне этого назначения.

Чтобы быть более точным в исходном вопросе (который я решаю самостоятельно, набирая этот вопрос), чтобы избежать вопроса X - Y:

Я борюсь за рисование на компонентах Java GUI. То, чего я хочу достичь, это как «холст» или «бумага» внутри JFrame, где я могу рисовать на нем все, что мне нравится, с помощью управления пикселями, полностью используя Kotlin.

После некоторых поисков я обнаружил, что основное решение вопроса «если я что-то рисую, используя функцию серии * 1056», это рисование исчезнет, ​​когда (я изменяю размер или минимизирую этот JFrame, или просто вызываю это рисование функция слишком рано, когда этот JFrame показывает (примечание: мы можем использовать Thread.sleep, чтобы отложить слишком ранний вызов)) ", это путем переопределения paint function . Затем, чтобы переопределить его, я использую var image = BufferedImage(...) для хранения того, что я нарисовал, и использую анонимный объект

painting = object : JFrame()
{
    override fun paint(g: Graphics?)
    {
        contentPane.graphics.drawImage(image, 0, 0, this)
    }
}.apply { /* do some initialization */ }

для переопределения функции paint и отрисовки этого буферизованного изображения в contentPane, который, кажется, достиг того, чего я хочу, и просто "статическую" рисование.

Мне было интересно, как я могу добавить функцию updatePainting() к этому painting, которая заставляет меня просто изменить это буферизованное изображение, а затем вызвать эту функцию, чтобы обновить картину как «динамическую» картину. Однако, когда я набираю этот вопрос, я случайно обнаружил, что, просто изменив это изображение, автоматически обновит эту картину, нет необходимости вручную обновлять эту картину. Итак, этот оригинал На самом деле вопрос решен: эта bFunction не нужна в моей текущей ситуации . Но мне просто интересно, есть ли способ реализовать эти вещи, которые могут соответствовать этой (может быть странной) проблеме?

1 Ответ

0 голосов
/ 04 июля 2018

На самом деле, этот код (с bFunction внутри объявления анонимного объекта) будет работать отлично и сделает bFunction доступным снаружи ... но только если variable является локальным или закрытым. В обоих случаях он должен быть инициализирован таким образом вместе с объявлением, т.е. val variable = object : AClass() ....

Общедоступным / защищенным свойствам нужен тип, который может использоваться вне класса, который их объявляет, что неудивительно. В этом случае вам нужно будет назвать подкласс.

Страница, на которую вы ссылаетесь, покрывает

Обратите внимание, что анонимные объекты могут использоваться как типы только в локальных и частных объявлениях. Если вы используете анонимный объект в качестве возвращаемого типа публичной функции или типа открытого свойства, фактическим типом этой функции или свойства будет объявленный супертип анонимного объекта или Any, если вы не объявили какой-либо супертип , Члены, добавленные в анонимный объект, не будут доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...