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