CS61B - Lec 9 - Implementation Inheritance(Extends)

Implementation Inheritance: Extends

上个lecture中介绍了interface - implements继承方法。interface中只是定义了类可以实现的方法,不包含如何实现,并且继承类中必须override所有interface中出现的方法。

而本节的implementation inheritance,继承的是父类中所有的members。(注意private依然无法访问,但是可以通过super.方法访问父类中public方法,以下有示例)

Ex 1.
构造一个类RotatingSLList,继承自SLList,实现新功能。

public class RotatingSLList<Item> extends SLList<Item> {

	public void rotateRight() {
		Item x = removeLast();
		addFirst(x);
	}

就这样,可见SLList的方法removeLast(), addFirst()均被继承,可直接调用。

Ex 2.
构造一个类VengefulSLList,会记住所有remove的item,然后revenge!!

首先第一想法肯定是建一个list,保存所有item。

SLList<Item> deletedItems;

然后,要override一下removeLast方法,将每一个去掉的item在deletedItems中保存

@Override
	public Item removeLast() {
		Item x = super.removeLast();
		deletedItems.addLast(x);
		return x;
	}

这里注意,如果直接把SLList的方法复制过来,会报错,因为里面包括若干private变量,继承类中无法调用。所以,用super.removeLast()表明这里调用的是SLList的方法,然后保存,完成override。

然而,此时仍会报错,是因为deletedItems没有初始化,在构造函数中加入初始化

public VengefulSLList() {
		//super();
		deletedItems = new SLList<Item>();
	}

编译通过。然而这个super()是什么意思呢?

VengefulSLList<Integer> vs1 = new VengefulSLList<Integer>();

每当VengefulSLList初始化时,会自动调用父类SLList的构造函数,super()跟其意思相同,java自动完成了这项工作,所以super()可有可无。
super其实等于SLList

但是,如果想要初始化一个特定的值怎么办?

public VengefulSLList(Item x) {
		//super();
		deletedItems = new SLList<Item>();
	}

显而易见Item x根本没用,因为此时调用的是默认的SLList()空构造函数。

public VengefulSLList(Item x) {
		super(x);
		deletedItems = new SLList<Item>();
	}

这样才行。

Encapsulation

封装性。主要说用户不该接触的我们程序员就应该把他封起来,降低复杂度。

在写测试方法时,我们也不应该破坏封装性,深入内部进行测试,而是要站在用户的角度,思考他们能调用哪些方法。

Implementation Inheritance会破坏封装性
在这里插入图片描述
如图,VerboseDog继承自Dog,所以调用vd.barkMany(3)调用的是override的方法,但是VerboseDog中不存在bark()方法,回到父类Dog中寻找,找到,输出。选择a。没什么问题。
在这里插入图片描述
那么现在呢?Dog中的bark()调用的是barkMany()方法,此时vd.barkMany(3)调用VerboseDog中的barkMany,但其中的bark()方法依然会调用VerboseDog中的barkMany,造成无限套娃。

Casting

在这里插入图片描述
上图是一个上节提到的动态静态类型的问题。前面不多说,最后两行有编译错误,原因可以总结为:父类不能调用子类的方法,因为他没有;父类不能赋值给子类,因为父类大。
在这里插入图片描述
在这里插入图片描述
以上是一个比较危险的改变compile-time type(静态类型)的方式,一般建议不要采用。
(Poodle)的意思是让编译器认为本行代码中的静态类型为poodle,实际不会改变,只是暂时性的欺骗。

Higher Order Functions in Java

以函数为变量作为higher order函数的输入。在java中实现。

/**
 * Represent a function that takes in an integer, and returns an integer
 */
public interface IntUnaryFunction {
    int apply(int x);
}
public class TenX implements IntUnaryFunction {
    public int apply(int x) {
        return 10*x;
    }
}
/**
 * Demonstrates higher functions in java.
 */
public class HoFDemo {
    public static int do_twice(IntUnaryFunction f, int x) {
        return f.apply(f.apply(x));
    }

    public static void main(String[] args) {
        IntUnaryFunction tenX = new TenX();
        System.out.println((do_twice(tenX, 2)));
    }
}
发布了20 篇原创文章 · 获赞 0 · 访问量 170

猜你喜欢

转载自blog.csdn.net/fourier_transformer/article/details/105167938