我的代码 -
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
或覆盖
修饰符
时,这种技术不起作用。
那么,是否可以封装
名称
变量
?
移除< 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”,并在有关类的章节中给出了以下示例: 然后作者说,如果要覆盖该方法,则必须使用正确的参数显式调用父方法。 如果该班有一个以上的祖先班怎么办? 我是否必须显式调用所有祖先类的方法? 另外,我是否必须对要覆盖的其他任何方法执行此操作? 问题答案: 关于子类-超类调用,这本书有些过时了。在子类化内置类方面也有些过时。 如今看起来像这样: 请注意以下几点: 我们可