The SWT FAQ 中文(13)

来源:互联网 发布:淘宝代卖 编辑:程序博客网 时间:2024/05/16 03:40

(英文原文:http://www.eclipse.org/swt/faq.php)

翻译:Frank(frank(at)zijinshi.cn)

版本:Version 0.9

The SWT FAQ

 25.问: 为什么我无法子类化Button、Table这些组件?

答:实际上你可以,不过我们不建议你这么做。你 可以看看这篇文章,它详细地告诉你如何创建自己的组件:le Creating Your Own Widget using SWT。

直接子类化组件

在极端的情况下,你可能需要子类化一个组件。当然,不仅仅是CanvasComposite。我们强烈建议你不要这么做,除非别无它法。在尝试子类化它之前,先尝试着看是否能够封装它。原因如下:

  • 子类化可能会继承出很多无意义的API,不得不重写。在Java里面,我们在重写一个方法的时候,不能改变返回类型,因此有些方法我们重新实现。
  • 子类化在扩展不属于我们自己的类的时候显然不是最好的方法。如果你想问我支持这一观点的论据,你可以看看 98年11月份Bill VennersJava World上写的这篇文章:Inheritance versus composition: Which one should you choose?,地址是:http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html。
  • 组件子类化绝大部分都是平台相关的,除非你花费大量的精力以保证它在所有的平台上都能运行。
  • 当超类的非API实现改变时,子类化的组件可能会受到影响。
  • 子类化容易产生系统级别的缺陷,有资源泄漏的风险。比如说,如果子类实现了一个方法,却并没有确保它的超类仍旧调用了释放资源的代码,那么就可能会导致系统资源泄漏。
  • 不同发布版本间可能会变得不兼容。如果一个method signature或field name 改变了,或者增加了新的方法或域,子类中可能会存在名字冲突。仅仅只有CanvasComposite能够保证在以后的发布版本中没有名字冲突。
  • 参考 Leonid Mikhajlov在“Fragile Base Class Problem”中写的论文。你在http://www.cas.mcmaster.ca/~emil/publications/fragile/很容易找到“A Study of The Fragile Base Class Problem”这篇文章。

子类化CanvasComposite是确保你的组件在任何SWT平台上工作的最好的方法。测试中的“is-a”测试可以测试出你的组件是否是is-a基本组件还是一个符合组件。在子类化任何组件之前应该确保是否这个组件是一个SWT已经子类化的SWT native 组件。例如,尽管PictureLabel 是个100%跨平台的,但它不是一个native Label

在子类化任何非CompositeCanvas 之前,请确保要覆盖方法protected void checkSubclass(),让这个方法不做任何事。在覆盖它之前请确保你已经阅读了这个方法的注释。 

26.问:当程序中组件改变时,为什么没有触发Selection这之类的事件?
答:在设计时,我们就是这么做的,主要是为了使不需要发送的事件大到最小化。例如,当我们编程让一个控件的选择状态发生改变时,SWT并不在意这个选中事件。否则,如果选中多次,将会发送多次事件,接收这个事件的那段代码也会执行多次,这样就导致了系统效率问题。当然,如果你一定希望这么做的话,你可以创建一个Event对象,在组件上触发Widget.notifyListeners(int, Event)事件。注意,一些程序触发事件会发出,尤其是一些低级的组件操作,如聚焦、移动或者大小改变。

(待续…)