【问题标题】: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 方法中传递矩阵的想法,因为将来我可能需要向该方法添加更多参数。

有没有办法解决这个问题?

【问题讨论】:

    标签: kotlin design-patterns delegates structure access-modifiers


    【解决方案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 类必须双向相互引用。

      【讨论】:

        猜你喜欢
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多