如何重写基类中的相等性?

拉斯夫

我需要类似的东西:

trait Base {
  override def equals(other: Any): Boolean = other match {
    case that: this.type => true
    case _ => false
  }
}

case class Derived() extends Base

但是,this.type这里的模式匹配似乎是错误的方法,因为

val x = Derived()
val y = Derived()
x == y  //always false

总是会产生假的。是否可以覆盖所有派生类的基类中的equals(也许通过使用ClassTag或TypeTag),还是必须始终在派生类中定义它?

拉斯夫

这达到了目的:

trait Base {
  type DerivedType <: Base
  implicit def tag: ClassTag[DerivedType]

  override def equals(other: Any): Boolean = validateType(other)

  def validateType(other: Any): Boolean = other match {
    case that: DerivedType => doSomethingAndReturnBoolean(that)
    case _ => false
  }
}

case class Derived() extends Base {
  type DerivedType = Derived
  override val tag = reflect.classTag[DerivedType]
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

基类中的重写函数

如何在Javascript中重写基类构造函数

在Java中,如何从派生类中的重写方法中调用基类的方法?

Javascript:在派生类中重写之前如何调用基类函数?

如何在非抽象基类的派生类中强制重写?

如何避免基类中的多语性调用

如何在Swift中为自定义类创建相等性测试?

如何在C#中检查自定义类数组的相等性?

如何实现基类的虚方法以及如何在C#中的重写方法中获得基方法的实现

如何在Coq中定义对的相等性?

如何在C#中重写基类的方法的某些部分

如何重写在多个继承中具有相同名称的基类的虚函数?

在子类中重写时如何调用私有虚拟基类实现

如何在类中重写toString方法

如何在Swift中重写ShinobiChart类

来自基类方法的重写方法调用如何工作?

如何重写基类\结构,例如int,string?

在基类重写的 ToString 方法中访问子类对象

C ++:在基类的构造函数中调用重写的方法

WebStorm:在ES6基类中重写Mark方法

从基类调用重写的方法

C ++多态性:派生类调用基类虚拟函数,而不是重写的派生类

如何比较 Ubuntu 中两个文件的相等性?

如何在Python中实现Frozenset相等性?

如何在F#中检查引用相等性?

如何在Rust中测试类型相等性?

如何在C ++中测试相关对象的相等性?

如何验证 PHP 中舍入值的相等性

如何使Python对象在相等性测试中始终返回true?