Scala抽象类型
身份未知的类型可以称为抽象类型。
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

