HW1吉他拟⾳CS61B-Spring-2018
接⼝和抽象类的⽤法:
接⼝常常有⼀串层次结构,这些接⼝由抽象类继承,并提供默认实现。抽象类⼜由具体的类继承。⼀个很好的例⼦是Collection接⼝:它扩展了Iterable(它的超级接⼝),并由许多⼦接⼝(即List,Set,Map)实现,⽽这些⼦接⼝⼜具有⾃⼰的抽象实现
(AbstractList,AbstractSet AbstractMap)
(关于接⼝中的default⽅法与抽象类中的⽅法,我的理解是,default⽅法⽆法代替抽象类⽅法,因为接⼝中没有实例变量,许多⽅法⽆法实现(⽐如getter和setter⽅法)或实现得效率很低。default⽅法只能来回调⽤接⼝中已经定义的其他⽅法,所以实现效率很低。抽象类中的⽅法可以根据该类的具体实例变量和所要实现的功能更⾼效地实现⼀些⽅法。)
注意:在写具体类的构造函数时,不要忘记它的⽗类的属性
⼤致过程
1. 实现boundedQueue数据结构
spring到底是干啥的public interface BoundedQueue<T> extends Iterable<T>⼀个接⼝,定义了这种有限长度队列的各种操作。
public abstract class AbstractBoundedQueue<T> implements BoundedQueue<T>⼀个抽象类,⽤于默认实现⼀些⽅法。
public class ArrayRingBuffer<T> extends AbstractBoundedQueue<T>⼀个具体类,⽤数组实现boundedQueue。核⼼思想还是循环数组。
2. 在GuitarString实现吉他的拟⾳
这⾥⾯采⽤了⼀个简单算法,主要原理和声⾳的频率、声⾳传导的衰减还有滤波有关系。算法原理应该蛮复杂的,但是实现很简单,只写了⼏个⼩⽅法。反正我也不理解,只是guide⾥说⼲啥我就⼲啥。
然后运⾏了准备好的“乐谱”,太酷了超长的⼀段⾳乐,很好听,CS61B的⽼师们真是太下功夫了,感动T T
顺便,还能够通过换数组的长度和算法中的⼩细节将吉他的声⾳变成竖琴、⿎等等。
3. 迭代器
针对ArrayRingBuffer数据结构写了⼀个迭代器。
注意,在写⾃⼰的迭代器类时,hasnext⽅法返回的实际上不是这个object还有没有下⼀个,实际上是当前这个object是不是已经为空了(即,如果是最后⼀个的后⼀个,才结束遍历)。
因为每次遍历的时候,在当前位置,都读取next()的值,所以next()返回的值实际上是当前object的值。⽽当当前object为空时,就结束遍历。
4. 异常
在插⼊数据超过size、或在空数组中删除数据时,throw a runtimeException。
记得在各个⽅法中考虑到这两种极端情况。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论