gpt4 book ai didi

java - Scala - 覆盖特征中的类方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:31 26 4
gpt4 key购买 nike

我是 Scala 的新手(来自 Ruby 世界)。

我对 Scala 中的“traits”概念很好奇(如果我理解正确的话,它应该类似于 ruby​​ 中的模块)。

这是一个用例。

假设我有一个名为 User 的类,定义如下:

class User {
def password() : String = "generating a password (default)"
}

假设我有一个 SecurePasswords 特征,我想使用它来“覆盖” User 类中定义的密码方法。

trait SecurePasswords {
def password() : String = "generating a secure password (non-default)"
}

而且,假设我希望它适用于 User 类的实例,而不是整个类本身。

val a = new User
val b = new User with SecurePasswords

a.password() # generating a password (default)
b.password() # generating a secure password (non-default)

现在这是我期望的理想输出,但是,我收到不同的错误,例如“匿名类继承冲突的成员...(注意:这可以通过声明等来解决...)"

这可以在 Scala 中完成吗,或者我要求太多/做一些非常奇怪的事情?是否可以不使用任何其他类定义,例如 UserWithSecurePassword extends User

提前谢谢大家!

P.S 如果您想知道“为什么?”,只需假设系统将包含许多需要密码(并且可能需要安全密码)的实体,因此可以在很多地方使用该特征。

最佳答案

这两个方法定义的冲突是因为你没有把它们定义为“相同的方法”。您所做的只是让它们巧合地具有相同的名称、参数和返回类型。

要使它们真正成为相同的方法,以便一个可以覆盖另一个,请在同一位置定义它们:

trait HasPassword {
def password(): String
}

class User extends HasPassword {
override def password(): String = "generating a password (default)"
}

trait SecurePassword extends HasPassword {
override def password(): String = "generating a password (non-default)"
}

new User with SecurePassword

通过在特征 HasPassword 中定义,然后在 UserSecurePassword 中覆盖(而不是 doppleganged 或 duck-typed),Scala理解这确实是被重新定义的相同方法。因此,当您混入 SecurePassword 时,它可以覆盖 User 中的 password() 方法。

关于java - Scala - 覆盖特征中的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com