加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 当组合继承的特征时,“覆盖”如何工作?

发布时间:2020-12-16 09:59:43 所属栏目:安全 来源:网络整理
导读:我在 Scala中尝试多重继承.我知道有一个从右到左的解决方案,但我不理解override关键字的作用.让我们考虑以下代码段: trait A { def method }class B extends A { def method = println("B") }trait C extends A { override def method = println("C") }trai
我在 Scala中尝试多重继承.我知道有一个从右到左的解决方案,但我不理解override关键字的作用.让我们考虑以下代码段:

trait A           { def          method                }
class B extends A { def          method = println("B") }
trait C extends A { override def method = println("C") }
trait E           {                                    }
class D extends B with C with E

它编译得很好,但如果我从最右边的特征定义方法中删除覆盖,它就会被破坏.为什么是这样 ?即使没有关键字,是不是覆盖了方法?

解决方法

如果某个特征应该替换(而不是提供缺少的实现)方法,则需要使用override关键字.无论其他方法是以特征还是以其他方式提供,都是如此.例如:

trait X { def foo = "foo" }
class Y { def foo = "bar" }
class Z extends Y with X  // Does not compile

所以它与抽象类的规则完全相同:您需要覆盖替换其实现的方法(而不是第一次提供).

请注意,对于traits,只要最后提供的方法是覆盖,就足够了:

trait L { def m: String }
trait M extends L { def m = "m" }
trait N extends L { def m = "M" }
trait O extends L { override def m = "?" }
class P extends M with N with O  // All good
class Q extends M with N { override def m = "." } // Also good

在这里,被称为“已经提供”的是扩展的早期部分,并且一切都很好.所以

class R extends O with N

不起作用,因为O提供m的实现(如果需要可以覆盖),但N然后尝试应用另一个,并且不允许覆盖.

另一方面,P很好,因为即使M和N都试图为m提供实现,O也是最后一个并且声明它的实现可以覆盖.它确实如此,一切都很顺利.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读