快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
  " subject="+subject+"]" }

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

时间:2011-01-30 IBM Ted Neward

非常简单明了。

敲定

当然,允许继承覆盖的反面就是采取措施防止它:基类需要禁止子类更改其基类行为,或禁止任何类型的继承类。在 Java 语言中,我们通过为方法应用修饰符 final 来实现这一点,确保它不会被覆盖。此外,也可以为类整体应用 final,防止继承。实现层次结构在 Scala 中的效果是相同的:我们可以向方法应用 final 来防止子类覆盖它,也可应用于类声明本身来防止继承。

牢记,所有这些关于 abstract、final 和 override 的讨论都同样适用于 “名字很有趣的方法”(Java 或 C# 或 C++ 程序员可能会这样称呼运算符),与应用于常规名称方法的效果相同。因此,我们常常会定义一个基类或特征,为数学函数设定某些预期(可以称之为 “Mathable”),这些函数定义抽象成员函数 “+”、“-”、“*” 和 “/”,另外还有其他一些应该支持的数学运算,例如 pow 或 abs。随后,其他程序员可创建其他类型 — 可能是一个 Matrix 类,实现或扩展 “Mathable”,定义一些成员,看上去就像 Scala 以开箱即用的方式提供的内置算术类型。

差别在于……

如果 Scala 能够如此轻松地映射到 Java 继承模型(就像本文至此您看到的那样),就应该能够从 Java 语言继承 Scala 类,或反之。实际上,这必须 可行,因为 Scala 与其他编译为 Java 字节码的语言相似,必须生成继承自 java.lang.Object 的对象。请注意,Scala 类可能也要继承自其他内容,例如特征,因此实际继承的解析和代码生成的工作方式可能有所不同,但最终我们必须能够以某种形式继承 Java 基类。(切记,特征类似于有行为的接口,Scala 编译器将特征分成接口并将实现推入特征编译的目标类中,通过这种方式来使之运作。)

但结果表明,Scala 的类型层次结构与 Java 语言中的对应结构略有不同;从技术上来讲,所有 Scala 类继承的基类(包括 Int、Float、Double 和其他数字类型)都是 scala.Any 类型,这定义了一组核心方法,可在 Scala 内的任意类型上使用:==、!=、equals、hashCode、toString、isInstanceOf 和 asInstanceOf,大多数方法通过名称即可轻松理解。在这里,Scala 划分为两大分支,“原语类型” 继承自 scala.AnyVal;“类类型” 继承自 scala.AnyRe。(scala.ScalaObject 又继承自 scala.AnyRef。)

通常,这并不是您要直接去操心的方面,但在考虑跨两种语言的继承时,可能会带来某些非常有趣的副作用。例如,考虑清单 12 中的 ScalaJavaPerson:

清单 12. 混合!

// This is Scala class ScalaJavaPerson(firstName:String, lastName:String, age:Int)   extends JavaPerson(firstName, lastName, age) {   val weight : Int = age * 2 // Who knows what Scala/Java people weigh?   override def toString = "[SJPerson: firstName="+firstName+               " lastName="+lastName+" age="+age+"]" }

……它继承自 JavaPerson:

清单 13. 看起来是否眼熟?

// This is Java public class JavaPerson {    public JavaPerson(String firstName, String lastName, int age)    {      this.firstName = firstName;      this.lastName = lastName;      this.age = age;    }    public String getFirstName()    {      return this.firstName;    }    public void setFirstName(Stri

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号