首页 > 其他分享 >无涯教程-Scala - 特性(Traits)

无涯教程-Scala - 特性(Traits)

时间:2024-01-26 14:33:04浏览次数:33  
标签:obj Point Demo Scala 无涯 Traits isEqual scala def

Traits封装了方法和字段定义,然后可以通过混合到类中来重用它们。与类继承不同,一个类可以混合任意数量的traits。

traits定义看起来类似于类定义,只是它使用关键字 trait 。以下是trait的基本示例语法。

Traits - 语法

trait Equal {
   def isEqual(x: Any): Boolean
   def isNotEqual(x: Any): Boolean=!isEqual(x)
}

此traits包含两个方法 isEqual 和 isNotEqual 。在这里,我们没有给出isEqual的任何实现,而另一种方法已经实现了。子类可以为未实现的方法提供实现。因此, traits与Java中的抽象类非常相似。

在这里,需要知道两种重要的Scala方法,在以下示例中将使用它们。

  • obj.isInstanceOf [Point]  要检查obj和Point的类型是否相同。

  • obj.asInstanceOf [Point] 表示通过采用对象obj类型进行精确转换,并返回与Point类型相同的obj。

Traits - 示例

trait Equal {
   def isEqual(x: Any): Boolean
   def isNotEqual(x: Any): Boolean=!isEqual(x)
}

class Point(xc: Int, yc: Int) extends Equal {
   var x: Int=xc
   var y: Int=yc
   
   def isEqual(obj: Any)=obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == y
}

object Demo {
   def main(args: Array[String]) {
      val p1=new Point(2, 3)
      val p2=new Point(2, 4)
      val p3=new Point(3, 3)

      println(p1.isNotEqual(p2))
      println(p1.isNotEqual(p3))
      println(p1.isNotEqual(2))
   }
}

将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。

\>scalac Demo.scala
\>scala Demo
true
false
true

Traits - 值类

Value classes是Scala中避免分配运行时对象的新机制,它包含一个仅带有一个 val 参数的主构造函数,它仅包含不允许使用var,val,嵌套类(nested classes), traits或Object的方法(def),值类不能由其他类扩展,这可以通过使用AnyVal扩展值类来实现。

Traits - 值类示例

trait Printable extends Any {
   def print(): Unit=println(this)
}
class Wrapper(val underlying: Int) extends AnyVal with Printable

object Demo {
   def main(args: Array[String]) {
      val w=new Wrapper(3)
      w.print() //实际上需要实例化一个 Wrapper 实例
   }
}

将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。

\>scalac Demo.scala
\>scala Demo

它将为您提供Wrapper类的hashCode。

Wrapper@13

参考链接

https://www.learnfk.com/scala/scala-traits.html

标签:obj,Point,Demo,Scala,无涯,Traits,isEqual,scala,def
From: https://blog.51cto.com/u_14033984/9430171

相关文章

  • 无涯教程-Scala - 数组(Arrays)
    Scala提供了一种数据结构数组,它存储了相同类型元素的固定大小的顺序集合。声明数组要在程序中使用数组,必须声明一个变量以引用该数组,并且必须指定该变量可以引用的数组的类型。varz:Array[String]=newArray[String](3)orvarz=newArray[String](3)在此,z被声明为可容......
  • 无涯教程-Scala - 闭包
    closure闭包是一个函数,其返回值取决于在此函数外部声明的一个或多个变量的值。以下带有匿名函数的代码。valmultiplier=(i:Int)=>i*10这里,函数体中使用的唯一变量i*10是i,它被定义为函数的参数,尝试以下代码-valmultiplier=(i:Int)=>i*factor乘数中有两个自由变......
  • 无涯教程-Scala - 函数声明
    函数是执行任务的一组语句,您可以将代码分成单独的函数,从逻辑上讲,划分通常是使每个函数执行特定任务。函数声明Scala函数声明具有以下形式-deffunctionName([listofparameters]):[returntype]如果您不使用等号和方法主体,则方法被隐式声明为抽象。函数定义Scala函数定......
  • 无涯教程-Scala - 环境设置
    Scala可以安装在任何基于UNIX或Windows的系统上,在机器上开始安装Scala之前,必须在计算机上安装Java1.8或更高版本。请按照下面给出的步骤安装Scala。步骤1-验证Java安装首先,您需要在系统上安装Java软件开发套件(SDK)。要验证这一点,请根据所使用的平台执行以下两个命令中的任......
  • 无涯教程-Rust - 并发(Concurrency)
    在并发编程中,程序的不同部分独立执行,另一方面,在并行编程中,程序的不同部分会同时执行。线程数我们可以使用线程同时运行代码,在当前的操作系统中,已执行程序的代码在一个进程中运行,并且操作系统一次管理多个进程,在您的程序中,您还可以具有可以同时运行的独立部分,运行这些独立部分的......
  • 无涯教程-Rust - 智能指针
    Rust默认情况下在堆栈上分配所有内容,您可以通过将它们包装在智能指针(如Box)中来将它们存储在堆上,智能指针实现下表中列出的特征-Sr.NoTraitnamePackage&描述1Derefstd::ops::Deref用于不可变的取消引用操作,如*v。2Dropstd::ops::Drop当值超出范围时用于......
  • 无涯教程-Rust - 迭代&闭包
    在本章中,我们将学习RUST中的迭代器和闭包如何工作。Iterator迭代器迭代器有助于迭代值的集合,例如数组,向量,Map映射等,迭代器实现Rust标准库中定义的Iteratortrait,iter()方法返回集合的迭代器对象,迭代器对象中的值称为元素,迭代器的next()方法可用于遍历元素,当到达集合末尾时,next......
  • 无涯教程-Rust - 文件输入&输出
    除了对控制台进行读写之外,Rust还允许对文件进行读写,File结构代表一个文件,它允许程序对文件执行读写操作,File结构中的所有方法均返回io::Result枚举的变体。写入文件以下程序创建文件"data.txt",create()方法用于创建文件,如果文件创建成功,该方法将返回文件句柄,最后一行write_a......
  • 无涯教程-Rust - 输入&输出
    本章讨论如何接受来自标准输入Input的值以及如何将值显示到标准输出Output,在本章中,我们还将讨论传递命令行参数。读和写Rust的input和output标准库函数围绕两个特征进行组织-Read读Write写Sr.NoTrait&描述Example1Read- 实现Read的类型具有面向字节输入的方法。S......
  • 无涯教程-Rust - 错误处理
    在Rust中,错误可以分为两大类,如下表所示。Name&描述UsageRecoverable可恢复的错误ResultenumUnRecoverable无法恢复的错误panicmacro与其他编程语言不同,Rust没有Exception异常,它返回可恢复错误的枚举Result<T,E>,如果程序遇到不可恢复的错误,则调用panic宏。Panic......