【问题标题】:Overriding subclass methods with subclassed arguments?用子类参数覆盖子类方法?
【发布时间】:2012-04-18 05:22:50
【问题描述】:

如何强制基方法在被子类覆盖时采用相同的特定子类实例?

即:

abstract class Animal {
  def mateWith(that: Animal)
}

class Cow extends Animal {
  override def mateWith...?
}

从逻辑上讲,Cow 应该只能mateWith 另一个Cow。但是,如果我执行override def mateWith(that: Cow),这实际上并不会覆盖基类方法(我希望它这样做,因为我想强制它在子类中存在)​​。

我可以检查以确保另一个实例是 Cow 类型,如果不是则抛出异常 - 这是我的最佳选择吗?如果我有更多的动物怎么办?我将不得不重复抛出异常的代码。

【问题讨论】:

    标签: scala inheritance overriding


    【解决方案1】:
    abstract class Animal[T <: Animal[T]] {
      def mateWith(that: T)
    }
    
    class Cow extends Animal[Cow] {
      override def mateWith(that: Cow) { println("cow") }
    }
    
    class Dog extends Animal[Dog] {
      override def mateWith(that: Dog) { println("dog") }
    }
    

    并像这样使用它:

    scala> (new Cow).mateWith(new Cow)
    cow
    
    scala> (new Cow).mateWith(new Dog)
    <console>:17: error: type mismatch;
     found   : Dog
     required: Cow
                  (new Cow).mateWith(new Dog)
                                     ^
    

    不需要抛出异常的代码;类型系统会在编译时为您处理!

    【讨论】:

    • 甜蜜的交易,Scala 真是太方便了!
    • 我不太确定“方便”,但可以表达。
    • 我想我会重新审视这个 - 这被称为f-bounded-polymorphism
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多