Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 我希望委托对象访问主对象的私有字段_Kotlin_Design Patterns_Delegates_Structure_Access Modifiers - Fatal编程技术网

Kotlin 我希望委托对象访问主对象的私有字段

Kotlin 我希望委托对象访问主对象的私有字段,kotlin,design-patterns,delegates,structure,access-modifiers,Kotlin,Design Patterns,Delegates,Structure,Access Modifiers,我想以可能的最佳方式构造代码,但我面临一个问题。 我想将绘制数据的任务委托给另一个对象。但是,另一个对象需要访问第一个对象的私有字段 我有一段代码: class Grid { private val matrix = Array<Array<Int?>>(10) { Array(10) { null } } private val gridDraw = GridDraw(this) fun draw(canvas: Canvas) {

我想以可能的最佳方式构造代码,但我面临一个问题。 我想将绘制数据的任务委托给另一个对象。但是,另一个对象需要访问第一个对象的私有字段

我有一段代码:

class Grid {

    private val matrix = Array<Array<Int?>>(10) { Array(10) { null } }

    private val gridDraw = GridDraw(this)
    
    fun draw(canvas: Canvas) {
        gridDraw.draw(canvas)
    }
    ...
}
类网格{
私有val矩阵=数组(10){Array(10){null}
private val gridDraw=gridDraw(此)
趣味绘画(画布:画布){
draw.draw(画布)
}
...
}
我希望GridDraw对象的draw()方法访问矩阵属性。如果matrix是一个私有字段,我不能这样做,我不想公开它

我不喜欢在draw方法中传递矩阵的想法,因为将来我可能需要为这个方法添加更多的参数


有办法解决这个问题吗?

为什么不公开矩阵?在没有矩阵的完整上下文的情况下,真的可以画图吗

这个问题的答案将推动您实现。至少,您需要从绘制它所需的矩阵(可能是整个矩阵)中公开必要的数据,或者构造
网格
类,使其能够绘制自身

虽然如果您只担心在将来使用更多参数扩展
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
)
类网格{
私有val矩阵=数组(10){Array(10){null}
//未来领域
private val foo=“bar”
private val gridDraw=gridDraw(GridDrawContext(矩阵,foo))
趣味绘画(画布:画布){
draw.draw(画布)
}
...
}
数据类GridDrawContext(
val矩阵:数组,
瓦尔福:字符串
)

如果GridDraw需要一个矩阵才能绘制,请将该矩阵作为其draw()函数的第二个参数,并在调用时传递矩阵

在GridDraw中:

fun draw(canvas: Canvas, matrix: Array<Array<Int?>>) {
    // use the canvas and matrix to draw it
}
fun draw(画布:画布,矩阵:数组){
//使用画布和矩阵绘制它
}
我不知道GridDraw中有什么,但是如果它只是一个实用函数包装器,您可能可以删除它对网格的属性引用。看起来您的设计具有不必要的相互依赖性,因为当前网格和GridDraw类必须双向引用