Scala抽象类型

时间:2020-02-23 14:41:44  来源:igfitidea点击:

身份未知的类型可以称为抽象类型。

Scala抽象成员

如果成员在类中没有完整的定义,则该成员被称为抽象成员。
这些在子类中实现。
例如;

trait Student {
type X
def totalmarks(m1:X,m2:X):X
val age : X	
}

学生特征声明X类型,其中X类型未知。
方法total标记返回类型X,成员mark1,marks2类型为X。
这里X称为抽象类型。

现在让我们在子类中实现类型X。

class Adam extends Student {
type X = Int 
def totalmarks(m1:Int , m2:Int) = m1 + m2
val age = 7
}

我们正在创建类Adam,该类扩展了学生类并将X类型定义为Integer。
总分数法将分数m1和m2相加。
age变量被初始化为7。

抽象值

抽象值采用以下形式:

val name: String

在此指定变量名称和类型,但不指定变量名称的值。

例如;

val name = "Reena"

当您不知道正确的值但可以知道该值在类的每个实例中保持不变时,可以在类中使用val声明。

抽象的val声明限制了其合法执行-def或者val。

例如;

abstract class Student {
val value:String
def method:String
}

使用值变量和关键字def创建方法的抽象类Student id。

abstract class Rob extends Student {
val value:String
val method:String
}

创建了一个Rob类,扩展了Student,并使用允许的关键字val定义了该方法。
该代码将成功编译。

abstract class Micheal extends Student {
def value: String
def method:String
}

创建了Micheal类,扩展了学生类,并使用关键字def定义了值和方法。
这将引发错误,因为不允许覆盖。
下图显示了以上在scala shell中执行的代码。

抽象变量

抽象var定义名称和类型,但不定义值。
考虑一个示例,该示例定义了两个抽象变量–名称和年龄,如下所示。

trait Student {
var name: String
var age: Int
}

声明的var配有getter和setter方法。

trait Student {
def name:String    //getter method for name
def name_=(n:String)  //setter method for name

def age:Int  //getter method for age
def age_=(a:Int) //setter method for age
}

初始化抽象值

当在超类中丢失时,抽象val允许我们在子类中提供详细信息。
例如;

trait student_percent {
val obtained: Int
val total: Int
require(total != 0)
val perc = (obtained % total) * 100
override def toString = "Percentage secured is" + perc
}

其中获得的变量和total是抽象值,并且未定义值。

scala> val scale = 5
scale: Int = 5

其中我们声明可变比例,并在以下特征中使用它们。

new student_percent {
 val obtained = 5 * scale
 val total = 5 * scale
}
java.lang.IllegalArgumentException: requirement failed
at scala.Predef$.require(Predef.scala:207)
at student_percent$class.$init$(<console>:11)
... 40 elided

引发此示例异常是因为初始化特征student_percent时total仍具有其默认值0,这导致需求调用失败。

预初始化字段

预先初始化的字段允许在调用超类之前初始化子类的字段。
字段定义放在超类构造函数调用之前的花括号中。
例如,将特征student_percent创建为;

trait student_percent {
val obtained: Int
val total: Int
require(total != 0)
val perc = (obtained.toFloat/total.toFloat) * 100
override def toString = "Percentage secured is" + perc
}

现在,通过将"获得"和"总计"的值初始化为

new {
val obtained = 80
val total = 100
} with student_percent

输出:res22:student_percent =安全百分比为80.0

这些字段可以在对象定义中初始化为;

object stud extends {
val obtained = 70
val total = 100
} with student_percent