在Kotlin中实现继承时,是否可以封装open和override变量以阻止main()函数的直接访问?

在Kotlin中实现继承时,是否可以封装open和override变量以阻止main()函数的直接访问?,kotlin,inheritance,overriding,visibility,encapsulation,Kotlin,Inheritance,Overriding,Visibility,Encapsulation,我的代码- fun main() { val student = Student() student.greet() } open class Person(open var name: String) { fun greet() { println("Hello $name") } } class Student(override var name: String = "John Doe"): Pers

我的代码-

fun main() {
    val student = Student()
    student.greet()
}

open class Person(open var name: String) {
    fun greet() {
        println("Hello $name")
    }
}

class Student(override var name: String = "John Doe"): Person(name) {

}

这里我有一个
家长
班级
和一个
孩子
班级
学生
<代码>父类
具有
属性
名称
方法
问候()
<代码>子类
学生
正在继承它们


在这里,我可以使用
Student.name
main()
函数直接修改
学生的
变量
。我想
封装
名称
变量
,以防止
名称
直接从
main()
函数
修改,从而
构造函数
学生()
是设置
名称
变量
值的唯一方法


通常,
私有
可见性修饰符
关键字
用于
变量
封装在
中。 但显然,当
变量
具有
打开
覆盖
修饰符
时,此技术不起作用



因此,是否可以
封装
名称
变量

删除
打开
关键字,并调用
Person
的构造函数来设置它,而不是从Student重写它(Person的init块也容易为空,请参阅):

openclass个人(私有变量名称:String){
val name get()=\u name
趣味问候{
println(“你好$name”)
}
}
班级学生(姓名:String=“John Doe”):个人(姓名){
}

删除open var和var您可以使用此问题中的两种解决方案,使
名称
在类外不可修改这里我在
student.greet()中遇到错误
main()
函数
。错误-->Kotlin:未解析的引用。由于接收器类型不匹配,以下候选项均不适用:public final fun greet():在SampleInheritation中定义的单位。Studentyou不能在没有打开的情况下使用继承,类默认为final这是我的问题,可以同时实现继承和封装吗?@IR42在这种情况下,可以使用
student.name
直接从
main()
function
修改
name
。我无法实现
封装
。但是在任何情况下都需要
封装
programming@PayelSenapati啊,我一开始其实误解了这个问题。我已经更新了。这将委托
name
的getter函数返回
\u name