快速业务通道

面向Java开发人员的Scala指南 - 实现继承 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
为值,这样您就可以在运行时需要切换功能的时候利用函数值。可将这种方法视为角色模式 —— Gang of Four 战略模式的一种变体,在这种模式中,对象角色(例如 Person 的当前就职状态)作为运行时值得到了更好的表现,比静态类型的层次结构更好。

面向Java开发人员的Scala指南 - 实现继承(4)

时间:2011-01-30 IBM Ted Neward

层次结构上层的构造函数

回忆一下编写 Java 代码的日子,有时继承类需要从构造函数传递参数至基类构造函数,从而使基类字段能够初始化。在 Scala 中,由于主构造函数出现在类声明中,不再是类的 “传统” 成员,因而将参数传递到基类将成为一个全新维度的问题。

在 Scala 中,主构造函数的参数在 class 行传递,但您也可以为这些参数使用 val 修饰符,以便在类本身上轻松引入读值器(对于 var,则为写值器)。

因此,清单 5 中的 Scala 类 Person 转变为清单 7 中的 Java 类,使用 javap 查看:

清单 7. 请翻译一下

// This is javap C:\Projects\scala-inheritance\code>javap -classpath classes Person Compiled from "person.scala" public abstract class Person extends java.lang.Object implements scala.ScalaObje ct{    public Person(java.lang.String, java.lang.String, int);    public java.lang.String toString();    public abstract void doSomething();    public int age();    public java.lang.String lastName();    public java.lang.String firstName();    public int $tag(); }  

JVM 的基本规则依然有效:Person 的继承类在构造时向基类传递某些内容,而不管语言强调的是什么。(实际上,这并非完全 正确,但在语言尝试规避此规则时,JVM 会表现失常,因此大多数语言仍然坚持通过某种方法为其提供支持。)当然,Scala 需要坚守此规则,因为它不仅需要保持 JVM 正常运作,而且还要保持 Java 基类正常运作。这也就是说,无论如何,Scala 必须实现一种语法,允许继承类调用基类,同时保留允许我们在基类上引入读值器和写值器的语法。

为了将此放到更具体的上下文中,假设我通过以下方式编写了 清单 5 中的 Student 类:

清单 8. 坏学生!

// This is Scala // This WILL NOT compile class Student(val firstName:String, val lastName:String, val age:Int)   extends Person(firstName, lastName, age) {   def doSomething =   {    System.out.println("I''m studying hard, Ma, I swear! (Pass the beer, guys!)")   } }

本例中的编译器将运行很长一段时间,因为我尝试为 Student 类引入一组新方法(firstName、lastName 和 age)。这些方法将与 Person 类上名称类似的方法彼此冲突,Scala 编译器不一定了解我是否正在尝试覆盖基类方法(这很糟糕,因为我可以在这些基类方法后隐藏实现和字段),或者引入相同名称的新方法(这也很糟糕,因为我可以在这些基类方法后隐藏实现和字段)。简而言之,您将看到如何成功覆盖来自基类的方法,但那并不是我们目前要追求的目标。

您还应注意到,在 Scala 中,Person 构造函数的参数不必一对一地与传递给 Student 的参数联系起来;这里的规则实际上与 Java 构造函数的规则完全相同。我们这样做只是为了便于阅读。同样,Student 可要求额外的构造函数参数,与在 Java 语言中一样,如清单 9 所示:

清单 9. 苛求的学生!

// This is Scala class Student(firstName:String, lastName:String, age:Int, val subject:String)   extends Person(firstName, lastName, age) {   def doSomething =   {    System.out.println("I''m studying

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号