快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
lastName, age) {   def doSomething =   {    System.out.println("I''m studying hard, Ma, I swear! (Pass the beer, guys!)")   } }

当尝试编译代码时,我发现无法编译。这是因为 Person.doSomething 方法的定义无法工作;这个方法需要一个完整的主体(或许可抛出异常来表示它应在继承类中被覆盖),或者不需要主体,类似于 Java 代码中抽象方法的工作方式。我在清单 5 中尝试使用抽象的方法:

清单 5. 抽象类 Person

// This is Scala abstract class Person(val firstName:String, val lastName:String, val age:Int) {   override def toString = "[Person: firstName="+firstName+" lastName="+lastName+               " age="+age+"]"   def doSomething; // note the semicolon, which is still optional           // but stylistically I like having it here } class Student(firstName:String, lastName:String, age:Int)   extends Person(firstName, lastName, age) {   def doSomething =   {    System.out.println("I''m studying hard, Ma, I swear! (Pass the beer, guys!)")   } }

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

时间:2011-01-30 IBM Ted Neward

请注意,我如何使用 abstract 关键字装饰 Person 类。abstract 为编译器指出,是的,这个类应该是抽象的。在这方面,Scala 与 Java 语言没有区别。

对象,遇到函数

由于 Scala 融合了对象和函数语言风格,我实际上建模了 Person(如上所述),但并未创建子类型。这有些古怪,但强调了 Scala 对于这两种设计风格的整合,以及随之而来的有趣理念。

回忆 前几期文章,Scala 将函数作为值处理,就像处理语言中的其他值一样,例如 Int、Float 或 Double。在建模 Person 时,我可以利用这一点来获得 doSomething,不仅将其作为一种继承类中覆盖的方法,还将其作为可调用、替换、扩展的 函数值。清单 6 展示了这种方法:

清单 6. 努力工作的人

// This is Scala class Person(val firstName:String, val lastName:String, val age:Int) {   var doSomething : (Person) => Unit =    (p:Person) => System.out.println("I''m " + p + " and I don''t do anything yet!");   def work() =    doSomething(this)   override def toString = "[Person: firstName="+firstName+" lastName="+lastName+               " age="+age+"]" } object App {   def main(args : Array[String]) =   {    val bindi = new Person("Tabinda", "Khan", 38)    System.out.println(bindi)    bindi.work()    bindi.doSomething =     (p:Person) => System.out.println("I edit textbooks")    bindi.work()    bindi.doSomething =     (p:Person) => System.out.println("I write HTML books")    bindi.work()   } }

将函数作为第一建模工具是 Ruby、Groovy 和 ECMAScript(也就是 JavaScript)等动态语言以及许多函数语言的常用技巧。尽管其他语言也可以用函数作为建模工具,(C++ 通过函数指针和/或成员函数指针实现,Java 代码中通过接口引用的匿名内部类实现),但所需的工作比 Scala(以及 Ruby、Groovy、ECMAScript 和其他语言)多得多。这是函数语言使用的 “高阶函数” 概念的扩展。(关于高阶函数的更多内容,请参见 参考资料。)

多亏 Scala 将函数视

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