Scala中的面向对象
发布时间:2020-12-16 18:35:26 所属栏目:安全 来源:网络整理
导读:从Martin Odersky的 Scala课程开始,我有以下练习(这是一个视频练习,其中给出了答案): “ 提供表示的抽象类Nat的实现 非负整数 不要在此实现中使用标准数字类. 而是实现子对象和子类. 一个用于数字零,另一个用于严格的数字. “ 这是代码: abstract class Na
从Martin Odersky的
Scala课程开始,我有以下练习(这是一个视频练习,其中给出了答案):
“ 不要在此实现中使用标准数字类. 一个用于数字零,另一个用于严格的数字. 这是代码: abstract class Nat { def isZero : scala.Boolean def predecessor : Nat def successor = new Succ(this) def + (that : Nat) : Nat def - (that : Nat) : Nat } object Zero extends Nat { def isZero = true def predecessor = throw new Error("0.predecessor") def + (that: Nat) = that def - (that: Nat) = if(that.isZero) this else throw new Error("negative number") } class Succ(n : Nat) extends Nat { def isZero = false def predecessor = n def +(that : Nat) = new Succ(n + that) def -(that: Nat) = n - that.predecessor } 在Scala工作表中我有: object NatTests { new Successor(Zero).+(new Successor(Zero)) } 这将返回一个新的Sucessor.我不认为我完全理解这段代码,因为我应该能够在不扩展代码的情况下添加非零对象?如果是这样,这是如何实现的? 解决方法
您可以添加非零数字/对象,而无需扩展任何类Nat,Zero或Succ.当您使用Nat类型的对象natObj并构造一个新对象new Succ(natObject)时,新对象表示的数字比natObj表示的数字高一个.
也许能够查看对象,使这更清楚: abstract class Nat { def isZero : Boolean def predecessor : Nat def successor = new Succ(this) def + (that : Nat) : Nat def - (that : Nat) : Nat } object Zero extends Nat { def isZero = true def predecessor = throw new Error("0.predecessor") def + (that: Nat) = that def - (that: Nat) = if(that.isZero) this else throw new Error("negative number") override def toString = "0 => Zero" } class Succ(n : Nat) extends Nat { def isZero = false def predecessor = n def + (that : Nat) = new Succ(n + that) def - (that: Nat) = if (that.isZero) this else n - that.predecessor override def toString = { def findNumber(nat: Nat): Int = if (nat.isZero) 0 else 1 + findNumber(nat.predecessor) val number = findNumber(this) String.valueOf(number) + " => " + ((1 to number) fold ("Zero")) ( (s,_) => "Succ(" + s + ")") } } 现在,您的Scala工作表将显示对象所代表的数字及其内部结构: object NatTests extends App { val nat0 = Zero val nat1 = new Succ(Zero) val nat2 = new Succ(nat1) // or new Succ(new Succ(Zero)) val nat3 = new Succ(nat2) // or new Succ(new Succ(new Succ(Zero))) println(nat0) //> 0 => Zero println(nat1) //> 1 => Succ(Zero) println(nat2) //> 2 => Succ(Succ(Zero)) println(nat3) //> 3 => Succ(Succ(Succ(Zero))) println(nat2 + nat2) //> 4 => Succ(Succ(Succ(Succ(Zero)))) println(nat3 + nat2) //> 5 => Succ(Succ(Succ(Succ(Succ(Zero))))) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |