package com.evor.test1
class Test1 {
} object Test1{
def main(args:Array[String]):Unit = { //类参数和抽象字段的初始化顺序并不一致
//抛出异常的原因:RationalTrait初始化的时候,denonArg仍然为0
/*
val r1 = new RationalTrait{
val numerArg=50;
val denomArg=60;
}
*/ //解决方案:预初始化字段。在调用超类之前初始化子类字段
val r2 = new {
val numerArg=50;
val denomArg=60;
}with RationalTrait
}
} //解决方案:预初始化字段。在调用超类之前初始化子类字段
object twoThirds extends {
val numerArg = 2;
val denomArg = 3;
}with RationalTrait //解决方案:预初始化字段。在调用超类之前初始化子类字段
//类定义中的预初始化字段
class RationalClass (n:Int,d:Int) extends{
val numerArg = n;
val denomArg = d;
}with RationalTrait{
def + (that:RationalClass) = new RationalClass (
numer *that.denom +that.numer*denom, denom*that.denom)
} trait RationalTrait{
val numerArg:Int ;
val denomArg:Int ;
require(denomArg!=0);
private val g = gcd(numerArg,denomArg)
val numer = numerArg/g
val denom = denomArg/g private def gcd(a:Int,b:Int):Int={
if(b==0) a
else gcd(b,a%b)
} override def toString = numer+"/"+denom;
}

  

懒加载

//懒加载
//定义的文本顺序不用多考虑,因为初始化是按需的
//g将在numer和denom之前完成初始化
trait RationalTrait{
val numerArg:Int ;
val denomArg:Int ; lazy val numer = numerArg/g
lazy val denom = denomArg/g lazy private val g = {
require(denomArg!=0);
gcd(numerArg,denomArg)
} private def gcd(a:Int,b:Int):Int={
if(b==0) a
else gcd(b,a%b)
} override def toString = numer+"/"+denom;
}

  

抽象类型

错误写法

class Food

abstract class Animal{
def eat(food:Food)
} class Grass extends Food
class Cow extends Animal{
override def eat(food:Grass){} //cow类的eat方法不能重写animal类的eat方法,因为参数类型不同
}

  

正确写法

class Food

abstract class Animal{
type SuitableFood <:Food //类型有上界约束 Food
def eat(food:SuitableFood)
} class Grass extends Food
class Cow extends Animal{
type SuitableFood = Grass
override def eat(food:Grass){}
}

  

Scala学习笔记--抽象成员的更多相关文章

  1. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  2. Scala学习笔记及与Java不同之处总结-从Java开发者角度

    Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...

  3. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

  4. Scala学习笔记(三)类层级和特质

    无参方法 功能:将方法的定义转换为属性字段的定义: 作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法: 例子: abstract cla ...

  5. Scala学习笔记之:tuple、array、Map

    [TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...

  6. Scala学习笔记(二)

    Scala面向对象: 类: 声明类(一个源文件中可以包含很多public的类) getter和setter 构造函数(主构造器和附属构造器) 继承(extends) 重写父类方法(override d ...

  7. Scala学习笔记——简化代码、柯里化、继承、特质

    1.简化代码 package com.scala.first import java.io.File import javax.management.Query /** * Created by co ...

  8. 机器学习(三)--- scala学习笔记

    Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...

  9. scala学习笔记:控制抽象

    def repeat(n:Int)(action: =>Unit)=for(i<-1 to n)action var i = 0 repeat(5){ println(i=i+1) } 另 ...

随机推荐

  1. org/hamcrest/SelfDescribing

    今天在Idea下使用JUtil的时候,运行@Test,报错:org/hamcrest/SelfDescribing 解决办法: (1)换成junit-4.8.jar (2)junit-4.11.jar ...

  2. Nexus Root Toolkit教程——刷机

    Nexus Root Toolkit是Nexus系列设备专属解锁.root.刷机.修复工具.本教程以Nexus7二代刷安卓5.0 Lollipop系统为实例演示刷机过程. 标签: 安卓5.0刷机教程 ...

  3. Altium Designer BGA扇出,原理图中PCB的类和布线规则设置

    本帖隐藏的内容 第一,Altium Designer 认识了这么久,没有用过他的自动扇出功能,今天一试,效果还算不错,不过现在还没有找到不扇出没有网络的引脚的方法,我现在讲我的自动扇出步骤给大家说一下 ...

  4. 【转】Android 之 下拉框(Spinner)的使用

    原文网址:http://imshare.iteye.com/blog/770950 下拉列表 Spinner. Spinner的使用,可以极大提高用户的体验性.当需要用户选择的时候,可以提供一个下拉列 ...

  5. bzoj4002

    http://www.lydsy.com/JudgeOnline/problem.php?id=4002 好吧,完全不会做,在考场只能爆零. 膜拜PoPoQQQ大神 #include<cstdi ...

  6. NOI 2013 书法家

    http://uoj.ac/problem/125 我真是日狗了...... 果然还是没有耐心读题,搞到读题读错了2个地方,结果调试了半天...... 言归正传. 动态规划. 这种题目很常见. 我们发 ...

  7. 流风ASP.NET框架商业版-工作流1.0简介

    流风ASP.NET框架商业版-工作流1.0简介 工作流简介 在流风ASP.NET框架商业版1.0推出后,就有集成工作流的想法,但是由于工作繁忙和其他事情的耽搁,时隔半年之久工作流1.0的版本才姗姗来迟 ...

  8. VS2012 中使用Emacs布局

    微软的反开源行为导致它不断的衰落,问题是还不反省. 下面这篇文章介绍了如何安装emacs布局的插件: http://marxistprogrammer.blog.163.com/blog/static ...

  9. 用Scrapy写一个爬虫

    昨天用python谢了一个简单爬虫,抓取页面图片: 但实际用到的爬虫需要处理很多复杂的环境,也需要更加的智能,重复发明轮子的事情不能干, 再说python向来以爬虫作为其擅长的一个领域,想必有许多成熟 ...

  10. iOS 语音识别使用讯飞报错

    You must rebuild it with bitcode enabled(Xcode setting ENABLE_BITCODE), obtain an updated library fr ...