当前位置: 首页 > 知识库问答 >
问题:

是否可以封装开放和覆盖变量,以防止在 Kotlin 中实现继承时从 main() 函数直接访问?

倪鹏
2023-03-14

我的代码 -

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) {

}

这里我有一个Person和一个学生Person具有属性name方法greet()学生正在继承它们。

在这里,我可以使用< code>student.name从< code>main() 函数中直接修改< code > Student < code > class 的< code>name 变量。我想< code >封装 name 变量以防止< code>name被< code>main() 函数直接修改,这样< code >构造函数 Student()就是设置< code>name 变量值的唯一方法。

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

那么,是否可以封装名称变量

共有1个答案

邹锦
2023-03-14

移除< code>open关键字,并调用< code>Person的构造函数来设置它,而不是从Student重写它(在Person的init块中也容易为空,请参见此处):

open class Person(private var _name: String) {
    val name get() = _name

    fun greet() {
        println("Hello $name")
    }
}

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

}
 类似资料:
  • 问题内容: 你能 声明这样 的函数吗? 然后像这样 重新声明 它… 这样可以覆盖函数吗? 可以吗 问题答案: 编辑 解决此答案未直接解决原始问题的评论。如果您是通过Google搜索到达的,请从此处开始 有一个名为override_function的函数可以实际使用。但是,由于此函数是Advanced PHP Debugger扩展的一部分,因此很难为生产使用提供参数。因此,我要说“否”,不可能以原始

  • 问题内容: 为什么超类的实例变量在继承中不被覆盖? 问题答案: 因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。 字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在让超类完成其工作。

  • 问题内容: 有没有一种方法可以完全使用客户端Javascript访问MySql数据库,或者是否需要使用PHP或C#这样的服务器端语言? 谢谢 问题答案: 如果Javascript在浏览器中运行,则无法访问MySQL数据库。首先,这是一个技术限制,因为Javascript无法通信任意协议(不,WebSockets不是解决方案)。请注意,作为服务器端和所有端的Node.js是一种“不同类型的javas

  • 问题内容: 我有两个班和。我有一个私有变量,可以通过setter和getter方法访问。我就是继承类用。 现在我可以更改using 的值。我想限制该选项。我希望它使其成为只读值。请协助我。 问题答案: 一种选择是从类中 删除 方法: 编辑: 为什么要这样做? 如果从继承,它应该能够执行与相同的动作。否则,继承的目的是什么?如果您仍然认为应该能够修改值而不能修改值,那么您的设计可能是错误的。您可以尝

  • 问题内容: 有什么方法可以防止子类覆盖基类中的方法? 我的猜测是没有,但是我来自.NET界,并且我正试图使我的API尽可能健壮,因此,任何输入都将不胜感激。 可以强制执行吗?我知道编译器无济于事,所以也许通过一些运行时检查来解决?还是这不是一种处理事情的Python方法? 问题答案: 您是对的:您的尝试与Python的结构及其文化背道而驰。 记录您的API,并教育您的用户如何使用它。这是他们的程序

  • 问题内容: 我正在阅读“深入Python”,并在有关类的章节中给出了以下示例: 然后作者说,如果要覆盖该方法,则必须使用正确的参数显式调用父方法。 如果该班有一个以上的祖先班怎么办? 我是否必须显式调用所有祖先类的方法? 另外,我是否必须对要覆盖的其他任何方法执行此操作? 问题答案: 关于子类-超类调用,这本书有些过时了。在子类化内置类方面也有些过时。 如今看起来像这样: 请注意以下几点: 我们可