【发布时间】:2010-09-30 16:08:42
【问题描述】:
请耐心等待...我认为这不是太主观,但也许我错了。
最近我想排除一些重复代码,这些代码在我们的 BlackBerry 应用程序上绘制了自定义位图背景。
(不过,这个问题与 BlackBerry 无关,因此我将在此处提供一些有关 BB GUI 的详细信息,以便非 BB Java 人员可以权衡......)
FullScreen 类来自 BB API - 它有一个方法 paint(Graphics),框架调用该方法来绘制屏幕以及添加到其中的任何组件。可以覆盖它以进行自定义绘画 - 例如在任何其他绘画发生之前绘制位图背景(较新的 BB API 提供背景类,但我们的应用程序必须在旧手机上工作)。
我想拥有一堆背景相同的屏幕,每个屏幕都进行某种自定义绘画......这就是我想出的:
abstract public class BGFullScreen extends FullScreen {
Bitmap bg;
public BGFullScreen(Manager mgr, long style) {
super(mgr, style);
bg = Bitmap.getBitmapResource("bg.jpg");
}
abstract protected void innerPaint(Graphics g);
protected void paint(Graphics g) {
g.drawBitmap(new XYRect(0, 0, bg.getWidth(), bg.getHeight()), bg, 0, 0);
innerPaint(g);
super.paint(g);
}
}
然后每个屏幕都会继承这个抽象类并实现innerPaint()。这样,当 BB 框架调用 paint() 方法时,每个屏幕都可以在绘制背景之后(因此任何绘制都发生在背景之上)但在绘制屏幕组件之前(全屏时)发生自定义绘画内容。调用paint()。
(我想出这个是因为我一直在家里学习Common Lisp,突然想到我想做的是像CLOS中的交错方法组合)
这是上面抽象类的示例实现:
public class MainAppScreen extends BGFullScreen {
public MainAppScreen() {
super(new VerticalFieldManager(), 0);
// add some components to the screen:
add(new ButtonField(...));
add(...)
}
protected void innerPaint(Graphics g) {
// stuff drawn will be on top of background and under buttons
g.draw(...)
}
}
基本上,我希望一个子类实现一个方法,该方法在其父类的实现与其祖父类的同一方法的实现之间被调用。我想不出任何其他方法可以在 Java 中做到这一点......
这是惯用的 Java 吗?这真的很常见吗?这是一个愚蠢的问题吗?这真的是可怕的设计吗? (BB专家,我该怎么做呢?)
编辑添加:这确实按描述工作 - 绘图按我想要的顺序发生。
【问题讨论】:
-
可能(对BB api一无所知),你可以打电话给
super.paint,之前,内部油漆 -
如果我将抽象类更改为在 innerPaint 之前调用 super.paint 则 innerPaint 中的内容将绘制在按钮之上,等等
-
只是对正确说这很好并且称为模板方法的答案的一个小补充:您可能希望使 paint() 最终,因此客户(具体子类)不会无意中弄乱它并破坏渲染。
标签: java oop blackberry