scala习题八——继承

来源:互联网 发布:知乎跳转淘宝链接 编辑:程序博客网 时间:2024/05/29 02:22

1.扩展如下的bankaccount类,新类checkingacount对每次存款和取款都收取1美元手续费

class BankAccount(initialBalance:Double){     private var balance=initialBalance;     def deposit(amount:Double)={       balance+=amount;balance;     }     def withdraw(amount:Double)={       balance-=amount;balance;     }   }   class CheckingAccount(initialBalance:Double) extends BankAccount(initialBalance){     private var balance=initialBalance;     override def deposit(amount:Double)={        balance+=(amount-1);balance;     }     override def withdraw(amount:Double)={        balance-=(amount+1);balance;     }     def show=balance;   }``2.扩展前一个练习的BankAccount类,新类SavingAccount每个月都有利息产生(earnMonthlyInterest方法被调用),并且有每月三次免手续费的存款或取款,在earnMonthlyInterest方法中重置交易计数,

class SavingAccount(initialBalance:Double) extends BankAccount(initialBalance){
private var balance=initialBalance;
private var traceCount=3;
private val lixi=0.003;
import java.util.Date;
val date=new Date();
private var lastMonth=date.getMonth();//初始化是记录月份
override def deposit(amount:Double)={
if(traceCount>0){
traceCount-=1;
balance+=(amount);
}else{
balance+=(amount-1);
}
balance;
}
override def withdraw(amount:Double)={
if(traceCount>0){
traceCount-=1;
balance-=(amount);
}else{
balance-=(amount+1);
}
balance;
}
def earnMonthlyInterest():Unit={
val nowdate=new Date();
val nowmonth=nowdate.getMonth();
if(nowmonth!=lastMonth){
lastMonth=nowmonth;
traceCount=3;
balance=balance*(1+lixi);
}
}

3.翻开你喜欢的C++或者java教科书,一定会找到用来继承层级的示例,可能是员工,动物,图形或类似的东西,用scala来生成这个示例动物示例

class animal{
def speak:Unit={println(“I am a Animal”)};
}
class Cat extends animal{
override def speak:Unit={
println(“I am a Cat”);
}
}
class Tiger extends Cat{
override def speak:Unit={
println(“I am a Tiger”);
}
}

4.定义一个抽象类Item,加入方法price和description,SimpleItem是一个构造器中给出价格好描述的物件。利用val可以重写def这个事实。Bundle是一个可以包含其他物件的物件,其价格是打包中所有物件的价格之和,同时提供一个将物件添加到打包中的机制,以及一个合适的description方法def返回类型与之后的重写类型必须一致
abstract class item{   def price:Double;   def description:String;    override def       toString="Description="+description()+"price="+price(); } class SimpleItem(Price:Double,Description:String) extends item{   override val price:Double=Price;   override val description:String=Description; } class Bundle extends item{   import scala.collection.mutable.ArrayBuffer;   val itemArray=new ArrayBuffer[SimpleItem]();   var totalPrice:Double=0;   override def price:Double={     for(i<- (0 until itemArray.length)){       totalPrice=totalPrice+itemArray(i).price;     }     totalPrice;   }   override val description:String={     itemArray.mkString(",");   }   def addItem(item:SimpleItem){     itemArray+=item;   } }
5.设计一个Point类,其X坐标和Y坐标可以通过构造器提供,提供一个子类LabledPoint,其构造器接受一个标签值和x,y,比如new LabeledPoint("Black Thursday"),1929,30);

class Point(X:Double,Y:Double){
val x=X;
val y=Y;
}
class LabledPoint(label:String,X:Double,Y:Double) extends Point(X,Y){
private val Label=label;
override def toString=”Label=”+Label+”X=”+X+”Y=”+Y;
}

6.定义一个抽象类Shape,一个抽象方法centerPoint,以及该抽象类的子类RectangleCircle,为子类提供合适的构造器,并重写centerPoint方法

abstract class Shape{
def centerPoint:(Double,Double);
}
class Cicrle(x:Double,y:Double,Radius:Double) extends Shape{
override def centerPoint={(x,y)};
}
class Rectangle(x:Double,y:Double,len:Double,width:Double) extends Shape{
override def centerPoint={
(x+len/2,y+width/2);
};
}

7.提供一个square类,扩展自java.awt.Rectangle并且有三个构造器,一个以给定的端点和宽度构造正方形,一个以(0,0)为端点,0为宽度的构造的正方形,一个以0,0为端点,给定的宽度来构造正方形

import java.awt.{Point => Po,Rectangle=>Rect}
class Square(point:Po,len:Int) extends Rect(point.x,point.y,len,len){
def this(){
this(new Po(0,0),0);
}
def this(len:Int){
this(new Po(0,0),len);
}

 }
8.编译8.6节的Person和SecretAgent类并使用javap分析类文件。总共有多少name的构造方法?他们分别取什么值(提示,可以用-cprivate选项)

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\pengchen>javap C:\Users\pengchen\workspace\hello\bin\person.class
Compiled from “person.scala”
public class person {
public java.lang.String name();
public java.lang.String toString();
public person(java.lang.String);
}

C:\Users\pengchen>javap C:\Users\pengchen\workspace\hello\bin\SecretAgent.class
Compiled from “person.scala”
public class SecretAgent extends person {
public java.lang.String name();
public java.lang.String toString();
public SecretAgent(java.lang.String);
}

C:\Users\pengchen>javap -c C:\Users\pengchen\workspace\hello\bin\SecretAgent.cla
ss
Compiled from “person.scala”
public class SecretAgent extends person {
public java.lang.String name();
Code:
0: aload_0
1: getfield #14 // Field name:Ljava/lang/String;
4: areturn

public java.lang.String toString();
Code:
0: aload_0
1: getfield #18 // Field toString:Ljava/lang/String;

   4: areturn

public SecretAgent(java.lang.String);
Code:
0: aload_0
1: aload_1
2: invokespecial #22 // Method person.””:(Ljava/lan
g/String;)V
5: aload_0
6: ldc #24 // String secret
8: putfield #14 // Field name:Ljava/lang/String;
11: aload_0
12: ldc #24 // String secret
14: putfield #18 // Field toString:Ljava/lang/String;

  17: return

}

C:\Users\pengchen>javap -private C:\Users\pengchen\workspace\hello\bin\SecretAge
nt.class
Compiled from “person.scala”
public class SecretAgent extends person {
private final java.lang.String name;
private final java.lang.String toString;
public java.lang.String name();
public java.lang.String toString();
public SecretAgent(java.lang.String);
}

C:\Users\pengchen>
“`
两个值,一个是传入的codename,另一个是“secret”

9.在8.10节的creature类中,将val range替换成一个def,如果你在Ant子类中也用def的话会有什么效果,如果子类中也用val的话又会有什么效果?为甚么
用def的话并无副作用,但子类使用val的话编译无法通过,因为val只能重写val或者不带参数的def,而此时的def会带上Int参数

10.文件scala/collection/immutable/Stack.scala包含如下定义
class Stack[A] protected {protected val elems:List[A]}
请解释protected关键词的含义(提示:回顾我们在第5章关于私有构造器的讨论)
此构造方法只能被其子类调用,其他类不能调用

0 0