abstract类与abstract方法,abstract是什么意思,Java中abstract怎么使用(三)

发布时间:2016-04-12 16:00:22 来源:大铁棍娱乐网

《abstract类与abstract方法,abstract是什么意思,Java中abstract怎么使用(三)》是由大铁棍娱乐网(www.datiegun.com)编辑为你整理收集在【教育学习】栏目,于2016-04-12 16:00:22整理发布,希望对你有所帮助,可及时向我们反馈。

  Interface Shape{ void draw(); void reDraw(); } class Triangle implements Shape{ public void draw(){...} public void reDraw(){...} } class Circle implements Shape{ public void draw(){...} public void reDraw(){...} }只不过现在子类Triangle,Circle和Shape之间的关系就不是父子了。这样设计其实违背了常理,因为在我们的观念中,Triangle和Circle本来就应该是一种Shape而不应该是他们都遵守一定的操作方式(void draw(),void reDraw())

  如何扩展这些设计呢?譬如说为Triangle和Circle添加erase方法?如果是class Shape这样的设计,很简单,只要

  abstract class Shape{ public abstract void draw(); public abstract void reDraw(); public void erase(){ Window window=WindowContainer.getCurrentWindow(); window.clean(); } }Triangle和Circle的代码可以原封不动!

  你可能会问,为什么不把erase()设计成为abstract的。你当然可以把erase()设计成abstract的,然后在子类中重写这个方法,提供子类自己的实现。但是,在现实当中,你可能更赞同是用上面的设计。的确,erase方法只要简单的进行擦除就可以了,不是吗?这样一来,扩展就变的很容易了。

  如果是Interface Shape的设计,那你做的事可就多了

  Interface Shape{ void draw(); void reDraw(); void erase(); } class Triangle implements Shape{ public void draw(){...} public void reDraw(){...} public void erase(){ Window window=WindowContainer.getCurrentWindow(); window.clean(); } } class Circle implements Shape{ public void draw(){...} public void reDraw(){...} public void erase(){ Window window=WindowContainer.getCurrentWindow(); window.clean(); } }所有相关的代码,你都要修改!即便他们都做同样的事情!这样扩展实在是太麻烦了!你也许和我想的一样,定义接口本身的目的就是告诉大家,任何实现此接口的类,都有自己的实现方法!我们定义接口的目的是:你们的实现可以不一样,但是你们暴露的接口一定要一致

  可以举java类库当中的一个设计,Thread如果你要设计一个线程类,该怎么办?两种方法:

  //通过继承Thread类来实现 class MyThread extends Thread{ public void run(){}//覆盖Thread的run方法 }

  //通过实现Runnable接口来实现 class MyThread implements Runnable{ public void run(){}//实现Runnable的run方法,MyThread和YourThread的实现都不一样 }

  (看过Thread的源代码,你就会发现,其实Thread实现了Runnable)到此,你应该可以看的出来,为什么要继承Thread和为什么要实现Runnable了

推荐阅读