zoukankan      html  css  js  c++  java
  • Scala 面向对象(十):特质(接口) 三

    1 在特质中重写抽象方法特例

    提出问题,看段代码

    复制代码; "复制代码")

    trait Operate5 {
    def insert(id : Int)
    }
    trait File5 extends Operate5 {
    def insert( id : Int ): Unit = {

    println("将数据保存到文件中..") super.insert(id)

    }
    }

    复制代码; "复制代码")

    运行代码,并小结问题 (错误,原因就是没有完全的实现insert,同时你还没有声明 abstract overrid)

    解决问题

    方式1 : 去掉 super()...

    方式2:  调用父特质的抽象方法,那么在实际使用时,没有方法的具体实现,无法编译通过,为了避免这种情况的发生。可重写抽象方法,这样在使用时,就必须考虑动态混入的顺序问题。

    2 在特质中重写抽象方法

     理解 abstract override 的小技巧分享:

    可以这里理解,当我们给某个方法增加了abstract override 后,就是明确的告诉编译器,该方法确实是重写了父特质的抽象方法,但是重写后,该方法仍然是一个抽象方法(因为没有完全的实现,需要其它特质继续实现[通过混入顺序]

    重写抽象方法时需要考虑混入特质的顺序问题完整性问题 看4个案例,并判断结果。

    3 当作富接口使用的特质

    富接口:即该特质中既有抽象方法,又有非抽象方法

     4 特质中的具体字段

    特质中可以定义具体字段,如果初始化了就是具体字段,如果不初始化就是抽象字段。混入该特质的类就具有了该字段,字段不是继承,而是直接加入类,成为自己的字段。

    特质中未被初始化的字段在具体的子类中必须被重写。

    5  特质构造顺序

    特质也是有构造器的,构造器中的内容由“字段的初始化”和一些其他语句构成。具体实现请参考“特质叠加”

    第一种特质构造顺序(声明类的同时混入特质)

    调用当前类的超类构造器

    第一个特质的父特质构造器

    第一个特质构造器

    第二个特质构造器的父特质构造器, 如果已经执行过,就不再执行

    第二个特质构造器

    .......重复4,5的步骤(如果有第3个,第4个特质)

    当前类构造器

     

    第2种特质构造顺序(在构建对象时,动态混入特质)

    调用当前类的超类构造器

    当前类构造器

    第一个特质构造器的父特质构造器

    第一个特质构造器.

    第二个特质构造器的父特质构造器, 如果已经执行过,就不再执行

    第二个特质构造器

    .......重复5,6的步骤(如果有第3个,第4个特质)

    当前类构造器

    分析两种方式对构造顺序的影响

    第1种方式实际是构建类对象, 在混入特质时,该对象还没有创建。

    第2种方式实际是构造匿名子类,可以理解成在混入特质时,对象已经创建了。

  • 相关阅读:
    ASP.NET的三层架构(DAL,BLL,UI)
    页面开发辅助类—HtmlHelper初步了解
    ASP MVC之参数传递
    ASP.NET MVC学习之母版页和自定义控件的使用
    ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法
    UITableView动态改变Cell高度
    UITableView动态改变Cell高度
    nodejs豆瓣爬虫
    nodejs豆瓣爬虫
    苹果系统OSX中Automator批量重命名
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309063.html
Copyright © 2011-2022 走看看