在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
。