Котлин: Как получить доступ к закрытым данным членов класса по их объектам? - PullRequest
0 голосов
/ 21 июня 2019

Как мне получить доступ к p.name по его объекту, если он частный?

Здесь геттер и сеттер не работают.

class Person(f_name : String, l_name : String){
    private var name = f_name + l_name
    get() = field
    set(value) {
        field = value
    }
    private var age : Int? = null
        get() {
            println("Age getter")
            return field
        }
        set(value) {
            println("Age setter")
            field = value
        }
    constructor(f_name: String, l_name: String, age : Int):this(f_name, l_name){
        name = "Mr./Msr./Ms. $f_name $l_name"
        this.age = age
    }

}

fun main() {
    var p = Person("M", "M")
    var m = Person("P", "P", 20)

    println("p : Person(${p.name})") // Shows error here

}

Я не могу получить доступ к любому приватному участнику таким образом. Здесь нет необходимости использовать геттер и сеттер.

1 Ответ

1 голос
/ 21 июня 2019

Возможно, вы захотите подойти к этому с неизменным классом данных.Тогда сеттеры не нужны и геттеры могут быть общедоступными:

data class Person(
    val firstName: String,
    val lastName: String,
    val age: Int? = null
)

Полное имя, которое вы можете определить как свойство расширения:

val Person.name get() = "Mr./Msr./Ms. $firstName $lastName"

По умолчанию закрытые свойства недоступны, ноВы можете ограничить доступ к установщику, если хотите:

var name: String = ""
    private set

В общем случае свойство является получателем и, возможно, установщиком, обращающимся к полю.Поле никогда не бывает публичным.Поэтому для достижения того, что вы хотите, вам нужно только объявить свойство как var name: String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...