这是我第一次问问题,请原谅我在问问题时的错误,并告诉我如何提出一个更好的问题。
我要问的是
如何将成员函数添加到可在该对象外部调用的匿名对象中?还是这个要求太奇怪了,不应该实施?
请在下面考虑此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)
,该函数 just 属于variable
, not 属于AClass
,该函数可以可以直接使用
variable.bFunction(1)
?还是不可能这样做?
我尝试过的(当然,不满足我想要的):
fun AClass.bFunction(i: Int)
来解决它,但是这对于AClass
的其他实例来说可能是“不公平的”,因为他们实际上并不需要它。 bFunction
,上面提到的位置。但是,我只能在.apply {}
内部访问此函数,而不能在此分配范围之外访问。bFunction
内添加.apply {}
,但是这也使我可以在.apply {}
内访问它,而不是在此分配之外。更具体地说明原始问题(在键入此问题时由我自己解决),以避免出现X-Y问题:
我正在努力在Java GUI组件上绘画。我想要实现的是像JFrame
内的“画布”或“纸”一样,在这里我可以完全通过Kotlin通过像素控制在自己喜欢的东西上绘画。
经过一番搜索,我发现以下问题的核心解决方案是:“如果我使用contentPane.graphics.drawXXX
系列函数绘制某些东西,当(我调整此JFrame的大小或最小化它,或者只是调用此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中,这似乎达到了我想要的效果,并且只是“静态”绘画。
我想知道如何向此updatePainting()
添加painting
函数,这使我可以修改此缓冲图像,然后调用此函数来更新绘画,作为“动态”绘画。 但是,在我输入此问题时,我偶然发现,只需修改此图像,即可自动更新此绘画,而无需手动更新此绘画。这个最初的问题实际上已经解决了:在我当前的情况下这个bFunction是不必要的。但是,我只是想知道,有什么方法可以实现适合这个(可能很奇怪)问题的东西?
答案 0 :(得分:1)
实际上,此代码(在匿名对象的声明中带有bFunction
)可以很好地工作,并且可以使bFunction
在外部可以访问...但仅当variable
是本地或私有时。在这两种情况下,都必须像这样val variable = object : AClass() ...
一起初始化。
公共/受保护的属性需要一种可以在声明它们的类之外使用的类型,这不足为奇。在这种情况下,您必须命名子类。
您链接的页面涵盖了此
请注意,匿名对象只能在本地和私有声明中用作类型。如果您将匿名对象用作公共函数的返回类型或公共属性的类型,则该函数或属性的实际类型将是匿名对象的声明的超类型;如果未声明任何超类型,则为Any 。添加到匿名对象中的成员将不可访问。