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

标签 java scala inheritance overriding traits

我是 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/

相关文章:

java - Gson 和 Volley 的 Proguard 问题

scala - 无法理解 Play 2.0 中的 Iteratee.fold

sql - 为什么使用rank()窗口函数会破坏解析器?

c# - 输入保存受约束泛型类实例的变量

c++ - 引用基类时是否需要命名空间

java - 解析堆转储文件

java - 使文件传输更高效 Java

java - 检查字符串中是否有年份

algorithm - 在 Scala 中解压增量压缩的数字序列

ios - 覆盖 UIScrollView 子类中的委托(delegate)属性