大数据Saprk----Spark基础--Scala的组合和继承

first Codec

**public class Friend {
	public static void main(String[] args){
		System.out.println("BigData加QQ群:947967114");
	}
}**

1、布局类库
本章我们的学习目的是构建和渲染二维布局元素的类库。每个元素表示用文本填充的长方形。首先需要提供一个elem的工厂方法。可以用下面这个标签的工厂方法创建一个包含字符串的布局元素:
elem(s:String):Element
我们用一个名为Element的类型对元素建模,可以对一个元素调用above或者beside,传入另一个元素,来把两个元素组合起来。
val columns1=elem(“hello”) above elem(“")
val columns2=elem("
”) above elem(“world”)
column1 beside columns2
最终的打印效果
hello *****
***** world
这样一个布局系统,对象可以通过组合操作符(above或beside)的帮助由简单的部件构建。要达到这个目的,首先要构建Element对象,在对象内定义elem工厂方法,并且还要定义above和beside方法。
2、抽象类
首先我们需要定一个Element类型,用来表示元素。由于元素是字符组成的二维矩阵,我们就使用contents来表示布局元素的内容,每个字符串代表一行。contents返回的类型将会是Array[String]:示例如下:
abstract class Element{
def contents:Array[String]
}
类中contents被声明为没有实现的方法,也就是说这个方法是Element的抽象成员。一个包含抽象成员的类本身也要声明为抽象的,实现的方式是在class前面加上abstract修饰符。
abstract class Element
由于是抽象的所以不能直接实例化。new Element是不允许的。如果想使用Element需要创建其子类,这些子类可以被实例化,在子类中填充了抽象的contents方法的实现。
我们会提出一个问题, def contents:Array[String]并没有使用关键字abstract修饰啊,为什么说他是抽象的方法呢??这是scala的特点,和java不同,在scala里一个方法没有实现即没有使用等号并且在等号后面写上方法体,那么这个方法就是抽象的。另一种说法是声明和定义,Element中contents被声明但是没有定义,那么就是抽象的。
3、定义无参的方法
接下来我们给Element添加获取高度和宽度的方法,分别是height和width。height返回contents中的行数,width返回第一行的长度,如果height为0那么width自然为0.
abstract class Element{
def contents:Array[String]
def height:Int=contents.length
def width:Int=if(height0) 0 else contents(0).length
}
我们可以看到Element的每个元素都没有参数,连空参数都没有写。
如果是空参数应该写成:
def height():Int=contents.length
def width():Int=if(height
0) 0 else contents(0).length
无参的方法以后将经常看到,一般scala建议对于没有参数且只是通过对象字段的方式访问状态的情况下,尽量使用无参的方法。这样的好处是使用者不会受到某个属性是用字段还是方法实现的影响。
举例来说,以上方法由于是无参方法,所以这些方法完全可以换成字段定义
abstract class Element{
def contents:Array[String]
val height:Int=contents.length
val width:Int=if(height==0) 0 else contents(0).length
}
对于使用方来说,两种方式完全一样,唯一一点区别可能是字段的访问要比方法调用快些。因为字段初始化时就被预先计算好,而方法每次调用时都重新计算。另一方面字段需要Element为其分配额外的内存空间。所以两种方式都有利弊。

对于无参和空括号方法的处理,scala是非常灵活的。可以使用空括号来重写无参方法,反过来亦然。可以在调用空括号方法时省去空括号。例如
scala> Array(1,2,3).toString
res2: String = [I@5a772895

scala> “abc”.length
res3: Int = 3
从原理上来说scala可以省去所有空参方法的括号。
4、扩展类
我们已经说过因为Element是抽象的所以不能使用关键字new出来。那么我们仍然像创建出来怎么办呢?我们需要创建一个扩展自Element的子类,并实现contents的抽象方法。
示例如下:
class ArrayElement(conts:Array[String]) extends Element{
def contents:Array[String]=conts
}
ArrayElement扩展了Element,同样也是使用的关键字extends,extends有两个作用:使得ArrayElement类从Element类继承所有的非私有的成员,并且让ArrayElement成为Element的子类型。ArrayElement是Element的子类,Element就是ArrayElement的超类。如果没有extends那么scala就会默认你继承的是scala.AnyRef,而java是java.lang.Object.

继承是超类的所有成员也是子类的成员,但是两种情况除外,一种是超类的私有成员不会被子类继承,二是如果子类实现了相同名称和参数的方法,那么该成员也不会被继承。这种方式就是重写。如果子类的成员是具体的而超类的是抽象的我们就说这个具体的成员实现了抽象的成员。
在本例中ArrayElement就重写了Element的contents方法,并且从Element继承了width和height两个方法。我们可以定义ArrayElement进行测试:
scala> val aElement=new ArrayElement(Array(“helli”,“world”))
aElement: ArrayElement = ArrayElement@38eb2c50

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值