【问题标题】:How to add an outside callable member functions to an anonymous object?如何将外部可调用成员函数添加到匿名对象?
【发布时间】:2018-07-04 14:47:27
【问题描述】:

这是我第一次提问,请原谅我提问的错误,如果发生这种情况,请告诉我如何提出更好的问题。

我在问什么:

如何将成员函数添加到匿名对象中,该对象可在该对象外部调用?还是这个要求太奇怪了不应该实现?

考虑下面这个object expression

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)

?或者,不可能?

我已经尝试过(当然,没有满足我想要的):

  • 我可以创建一个extension function fun AClass.bFunction(i: Int) 来解决它,但这对于AClass 的其他实例可能“不公平”,因为它们实际上并不需要它。
  • 我可以创建一个类而不是在本地使用匿名对象,但是为 ONE 变量创建一个类似乎太重了。
  • 我尝试在匿名对象的声明中添加bFunction,其中位置如上所述。但是我只能在 .apply {} 内部访问这个函数,而不是在这个分配之外。
  • 我尝试在.apply {} 中添加bFunction,但这也让我只能在.apply {} 中访问它,而不是在此任务之外。

更具体的原始问题(由我自己解决,同时输入此问题)以避免 X - Y 问题:

我正在努力在 Java GUI 组件上绘画。我想要实现的就像JFrame 中的“画布”或“纸”,我可以通过像素控制在上面绘制任何我喜欢的东西,完全使用 Kotlin。

经过一番搜索,我找到了问题的核心解决方案,“如果我使用contentPane.graphics.drawXXX系列函数绘制一些东西,这个draw会在(我调整这个JFrame的大小或最小化,或者只是调用这个draw)时消失函数太早,当这个 JFrame 显示时(注意:我们可以使用Thread.sleep 来延迟太早的调用))”,是by overriding 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中,这似乎实现了我想要的,只是一个“静态”绘画。

我想知道如何向这个painting 添加一个updatePainting() 函数,这样我就可以修改这个缓冲的图像,然后调用这个函数来更新绘画,作为一个“动态”绘画。 但是,在我输入这个问题的过程中,我无意中发现,只要修改这张图片,就会自动更新这幅画,不需要手动更新这幅画。 所以这个原始问题实际上解决了:在我目前的情况下,这个 bFunction 是不必要的。但是,我只是想知道,有没有什么方法可以解决这个(可能很奇怪)的问题?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    实际上,这段代码(在匿名对象的声明中带有bFunction)可以很好地工作,并使bFunction 可以在外部访问……但前提是variable 是本地或私有的。在这两种情况下,它都必须像这样与声明一起初始化,即val variable = object : AClass() ...

    公共/受保护的属性需要一种可以在声明它们的类之外使用的类型,这并不奇怪。在这种情况下,您必须命名子类。

    你链接的页面涵盖了这个

    请注意,匿名对象只能在本地和私有声明中用作类型。如果您使用匿名对象作为公共函数的返回类型或公共属性的类型,则该函数或属性的实际类型将是匿名对象的声明超类型,或者如果您没有声明任何超类型,则为 Any .添加到匿名对象中的成员将无法访问。

    【讨论】:

    • 谢谢!最重要的部分是必须像这样连同声明一起初始化,避免variable的显式类型声明,避免variable的“类型缩小”,这将使@987654327 @丢了那个bFunction
    • 是的,就是这个原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多