Scala程序中怎么实现多态和动态绑定

发布时间:2021-07-15 09:45:37 作者:chen
来源:亿速云 阅读:190

本篇内容主要讲解“Scala程序中怎么实现多态和动态绑定”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala程序中怎么实现多态和动态绑定”吧!

在10.4节中你看到了类型Element的变量可以指向类型ArrayElement的对象。这种现象的名字叫多态:polymorphism,是指“许多形状”或“许多形式”的意思。这种情况下,Element对象可以有许多形式。这种类型的多态被称为子类型化多态:subtyping polymorphism。Scala里另一种类型的多态,称为统一多态:universal polymorphism,将在第19章讨论。目前为止,你已经看到了两种形式:ArrayElement和LineElement。你可以通过定义新的Element子类创造Element的更多形式。例如,下面定义了拥有给定长度和高度并被指定字符充满的新的Element形式:

class UniformElement(   ch: Char,   override val width: Int,   override val height: Int  ) extends Element {   private val line = ch.toString * width   def contents = Array.make(height, line)  }

Scala程序中怎么实现多态和动态绑定

图释 10.3 布局元素的类层级

51CTO编辑推荐:Scala编程语言专题

类Element的继承层级现在看上去如图释10.3展示的样子。结果,Scala将接受所有的下列赋值,因为赋值表达式的类型符合定义的变量类型:

val e1: Element = new ArrayElement(Array("hello", "world"))  val ae: ArrayElement = new LineElement("hello")  val e2: Element = ae  val e3: Element = new UniformElement('x', 2, 3)

若你检查继承层级,你会发现这四个val定义的每一个里,等号右侧表达式的类型都在将被初始化的等号左侧的val类型之下。

然而,另一半的故事是,变量和表达式上的方法调用是动态绑定:dynamically bound的。这意味着被调用的实际方法实现取决于运行期对象基于的类,而不是变量或表达式的类型。为了演示这种行为,我们会从我们的Element类中临时移除所有存在的成员并添加一个名为demo的方法。我们会在ArrayElement和LineElement中重载demo,但UniformElement除外:

abstract class Element {   def demo() {    println("Element's implementation invoked")   }  }  class ArrayElement extends Element {   override def demo() {    println("ArrayElement's implementation invoked")   }  }  class LineElement extends ArrayElement {   override def demo() {    println("LineElement's implementation invoked")   }  }  // UniformElement inherits Element’s demo  class UniformElement extends Element

如果你把这些代码输入到了解释器中,那么你就能定义这个带了一个Element并调用demo的方法:

def invokeDemo(e: Element) {   e.demo()  }

如果你传给invokeDemo一个ArrayElement,你会看到一条消息指明ArrayElement的demo实现被调用,尽管被调用demo的变量e的类型是Element:

scala> invokeDemo(new ArrayElement)  ArrayElement's implementation invoked

相同的,如果你传递LineElement给invokeDemo,你会看到一条指明LineElement的demo实现被调用的消息:

scala> invokeDemo(new LineElement)  LineElement's implementation invoked

传递UniformElement时的行为一眼看上去会有些可以,但是正确:

scala> invokeDemo(new UniformElement)  Element's implementation invoked

因为UniformElement没有重载demo,它从它的超类Element继承了demo的实现。因此,当对象的类是UniformElement时,Element的实现就是要调用的demo的正确实现。

到此,相信大家对“Scala程序中怎么实现多态和动态绑定”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. PHP5多态性与动态绑定方法
  2. 深入浅出OOP(三): 多态和继承(动态绑定/运行时多态)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

scala

上一篇:怎么在Linux中添加一块大于2TB的新磁盘

下一篇:CentOS Linux下有哪些分区工具

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》