Kotlin 如何将外部可调用成员函数添加到匿名对象?

Kotlin 如何将外部可调用成员函数添加到匿名对象?,kotlin,Kotlin,这是我第一次问问题,请原谅我问问题时的错误,如果出现这种情况,请告诉我如何提出更好的问题 我要问的是: 如何将成员函数添加到可在此对象外部调用的匿名对象中?或者这个要求太奇怪了,不应该实现 考虑如下: 如何添加一个函数fun bFunction(I:Int),该函数只属于变量,不属于AClass,可以直接使用 variable.bFunction(1) ??或者,这是不可能的 我尝试过的(当然,没有满足我想要的): 我可以创建一个有趣的AClass.b函数(I:Int)来解决它,但是这可能对

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

我要问的是:

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

考虑如下:

如何添加一个函数
fun bFunction(I:Int)
,该函数只属于
变量
,不属于
AClass
,可以直接使用

variable.bFunction(1)
??或者,这是不可能的

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

  • 我可以创建一个
    有趣的AClass.b函数(I:Int)
    来解决它,但是这可能对
    AClass
    的其他实例“不公平”,因为它们实际上并不需要它
  • 我可以创建一个类,而不是在本地使用匿名对象,但是为一个变量创建一个类似乎太重了
  • 我尝试在匿名对象的声明中添加
    bFunction
    ,其位置如上所述。但是,我只能在
    .apply{}
    内部访问此函数,而不能在此分配之外访问
  • 我曾尝试在
    .apply{}
    内部添加
    b函数
    ,但它也使我只能在
    .apply{}
    内部访问它,而不是在本作业之外
要更具体地说明原始问题(由我自己在键入此问题时解决),以避免出现X-Y问题:

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

经过一些搜索,我发现这个问题的核心解决方案是,“如果我使用
contentPane.graphics.drawXXX
series函数绘制一些东西,当显示这个JFrame时(我调整或最小化这个JFrame,或者太早调用这个draw函数),这个绘图就会消失。”(注意:我们可以使用
Thread.sleep
来延迟过早调用)),is。然后,为了覆盖它,我使用
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()
函数添加到这个
绘图
,这样我就可以修改这个缓冲图像,然后调用这个函数来更新绘图,作为“动态的”绘画。但是,在我输入这个问题的过程中,我意外地发现,只要修改这个图像,就会自动更新这幅画,而不需要手动更新这幅画。所以原来的问题实际上解决了:在我目前的情况下,这个B功能是不必要的。但是,我只是想知道,有没有如何实现这些东西,以适应这个(可能很奇怪)问题?

实际上,这段代码(在匿名对象声明中使用
b函数
)将非常好地工作,并将使
b函数
可在外部访问…但仅当
变量
为本地或私有时。在这两种情况下,它都必须与声明一起初始化,即
val variable=object:AClass()…

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

你链接的页面涵盖了这一点

请注意,匿名对象只能在本地和私有声明中用作类型。如果将匿名对象用作公共函数的返回类型或公共属性的类型,则该函数或属性的实际类型将是匿名对象的已声明超类型,如果未声明任何超类型,则为任何类型。成员a匿名对象中的dded将不可访问


谢谢!最重要的是它必须像这样与声明一起初始化,以避免
变量
的显式类型声明,避免
变量
的“类型缩小”,这将使
变量
失去
函数
。是的,这正是原因。
painting = object : JFrame()
{
    override fun paint(g: Graphics?)
    {
        contentPane.graphics.drawImage(image, 0, 0, this)
    }
}.apply { /* do some initialization */ }