快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
hard, Ma, I swear! (Pass the beer, guys!)")   } }

您又一次看到了 Scala 代码与 Java 代码有多么的相似,至少涉及继承和类关系时是这样。

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

时间:2011-01-30 IBM Ted Neward

语法差异

至此,您可能会对语法的细节感到迷惑。毕竟 Scala 并未像 Java 语言那样将字段与方法区分开来。这实际上是一项深思熟虑的设计决策,允许 Scala 程序员轻而易举地向使用基类的用户 “隐藏” 字段和方法之间的差异。考虑清单 10:

清单 10. 我是什么?

// This is Scala abstract class Person(val firstName:String, val lastName:String, val age:Int) {   def doSomething   def weight : Int   override def toString = "[Person: firstName="+firstName+" lastName="+lastName+               " age="+age+"]" } class Student(firstName:String, lastName:String, age:Int, val subject:String)   extends Person(firstName, lastName, age) {   def weight : Int =    age // students are notoriously skinny   def doSomething =   {    System.out.println("I''m studying hard, Ma, I swear! (Pass the beer, guys!)")   } } class Employee(firstName:String, lastName:String, age:Int)   extends Person(firstName, lastName, age) {   val weight : Int = age * 4 // Employees are not skinny at all   def doSomething =   {    System.out.println("I''m working hard, hon, I swear! (Pass the beer, guys!)")   } }

注意查看如何定义 weight 使其不带有任何参数并返回 Int。这是 “无参数方法”。因为它看上去与 Java 语言中的 “专有” 方法极其相似,Scala 实际上允许将 weight 定义为一种方法(如 Student 中所示),也允许将其定义为字段/存取器(如 Employee 中所示)。这种句法决策使您在抽象类继承的实现方面有一定的灵活性。请注意,在 Java 中,即便是在同一个类中,只有通过 get/set 方法来访问各字段时,才能获得类似的灵活性。不知道判断正确与否,但我认为只有少数 Java 程序员会用这种方式编写代码,因此不经常使用灵活性。此外,Scala 的方法可像处理公共成员一样轻松地处理隐藏/私有成员。

从 @Override 到 override

继承类经常需要更改在其某个基类内定义的方法的行为;在 Java 代码中,我们通过为继承类添加相同名称、相同签名的新方法来处理这个问题。这种方法的缺点在于签名录入的错误或含糊不清可能会导致没有征兆的故障,这也就意味着代码可以编译,但在运行时无法正确完成操作。

为解决这个问题,Java 5 编译器引入了 @Override 注释。@Override 验证引入继承类的方法实际上已经覆盖了基类方法。在 Scala 中,override 已经成为语言的一部分,几乎可以忘记它会生成编译器错误。因而,继承 toString() 方法应如清单 11 所示:

清单 11. 这是继承的结果

// This is Scala class Student(firstName:String, lastName:String, age:Int, val subject:String)   extends Person(firstName, lastName, age) {   def weight : Int =    age // students are notoriously skinny   def doSomething =   {    System.out.println("I''m studying hard, Ma, I swear! (Pass the beer, guys!)")   }   override def toString = "[Student: firstName="+firstName+               " lastName="+lastName+" age="+age+             

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