我想要一个委托对象访问主对象的私有字段
Posted
技术标签:
【中文标题】我想要一个委托对象访问主对象的私有字段【英文标题】:I want a delegate object to access a private field of the main object 【发布时间】:2021-05-24 06:42:59 【问题描述】:我想尽可能以最好的方式构建我的代码,但我遇到了一个问题。 我想将绘制数据的任务委托给另一个对象。但是,这个其他对象需要访问第一个对象的私有字段。
我有这段代码:
class Grid
private val matrix = Array<Array<Int?>>(10) Array(10) null
private val gridDraw = GridDraw(this)
fun draw(canvas: Canvas)
gridDraw.draw(canvas)
...
我希望 GridDraw 对象的 draw() 方法访问矩阵属性。如果矩阵是私有字段并且我不想将其公开,我不能这样做。
我不喜欢在 draw 方法中传递矩阵的想法,因为将来我可能需要向该方法添加更多参数。
有没有办法解决这个问题?
【问题讨论】:
【参考方案1】:您为什么不想公开矩阵?是否真的可以在没有矩阵的完整上下文的情况下进行绘制?
该问题的答案将推动您实施。至少,您需要从绘制它所需的矩阵(可能是整个矩阵)中公开必要的数据,或者构建您的 Grid
类,使其能够自行绘制。
虽然如果您只是担心将来使用更多参数扩展draw
方法,那应该是一个简单的解决方法。创建一个包含矩阵的 GridDrawContext
类,并让您的 GridDraw
类采用该上下文对象而不是 Grid
本身。
然后您可以进一步扩展您的上下文类,而不是更改您的 draw
接口。
class Grid
private val matrix = Array<Array<Int?>>(10) Array(10) null
// future field
private val foo = "bar"
private val gridDraw = GridDraw(GridDrawContext(matrix, foo))
fun draw(canvas: Canvas)
gridDraw.draw(canvas)
...
data class GridDrawContext(
val matrix: Array<Array<Int?>>,
val foo: String
)
【讨论】:
【参考方案2】:如果 GridDraw 需要一个矩阵来进行绘制,请将矩阵作为其 draw() 函数的第二个参数,并在调用它时传递您的矩阵。
在 GridDraw 中:
fun draw(canvas: Canvas, matrix: Array<Array<Int?>>)
// use the canvas and matrix to draw it
我不知道你在 GridDraw 中有什么,但如果它只是一个实用函数包装器,你可能可以删除它对 Grid 的属性引用。您的设计似乎具有不必要的相互依赖关系,因为目前您的 Grid 和 GridDraw 类必须双向相互引用。
【讨论】:
以上是关于我想要一个委托对象访问主对象的私有字段的主要内容,如果未能解决你的问题,请参考以下文章