我想要一个委托对象访问主对象的私有字段

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 类必须双向相互引用。

【讨论】:

以上是关于我想要一个委托对象访问主对象的私有字段的主要内容,如果未能解决你的问题,请参考以下文章

访问同一类中另一个对象的私有字段

我可以在 C++ 中转换对象并访问私有数据成员吗?

访问类中的私有字段[重复]

如何使用主委托类指针 .storyboard 对象?

python学习历程第19天

python——面向对象