站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题java多态性教学实例

java多态性教学实例

摘要: java多态性教学实例

</td> </tr> <tr> <td height="35" valign="top" class="ArticleTeitle"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="177" height="86" align="center" valign="top"> </td> <td width="507" valign="top" align="left"> <table class=contentTable cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <tr> <td align="left">
最近研究面向对象中的[多态性],我就写了一个非常简单的例子说明一下。该例子功能很简单,有些地方由于时间原因也没有仔细考虑,只能做个简单参考。

先介绍一下例子,很简单,这个程序可以选择事先定义的一种形状,然后绘制到窗口的绘图区域。其类的关系图如图(SimperDrawer.png),图中因为大小关系,有些画的不规范。

在这个程序中画图使用了多态性应用,所以增加图形种类时,几乎不需要修改源程序代码。其中创建对象时使用了“工厂方法”的最基本思想和“原型模式”。

一、基本方法介绍:

1、对象的创建方法:
在ToolBar类中,生成与按钮对应的形状对象时,没有使用new操作符,而是使用java的反射机制,动态加载类后使用newInstance方法创建对象。代码段如下:

// ToolBar.java
......
for(int i=0;i try {
s = (Shape)shapeTypes[i].newInstance();
shapes.add(s);
JToggleButton b = new JToggleButton(s.getClass().getName());
buttons.add(b);
this.add(b);
} catch(InstantiationException e) {
System.err.println("Cannot instantiate!");
} catch(IllegalAccessException e) {
System.err.println("Cannot Access!");
}
}
......

2、“原型模式”使用

用户在绘图时,选择了ToolBar中某图形后,画图时产生对象也不是用new操作符,而是使用“原型模式”原理,由ToolBar中对象Clone得到绘制的对象,代码段如下:


// drawPanel.java
......
public DrawPanel(ToolBar tbar, Picture pic) {
this.toolbar = tbar;
this.picture = pic;
this.setBackground(Color.WHITE);

this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent event) {
double cx = event.getX();
double cy = event.getY();

// 下面一句由复制得到绘制的图形对象
Shape s = (Shape)toolbar.getSelected().clone();

if(s!=null) {
s.setLocation(cx, cy);
picture.add(s);
repaint();
}
}
});
}

3. 多态性使用

在真正绘图操作时,使用多态方式,

首先,在DrawPanel.java中:
......
public void paintComponent(Graphics g)
{
super.paintComponent(g); // call method of parent class
Graphics2D g2 = (Graphics2D)g;
// 调用picture对象的draw方法,绘制已经产生的所有图形对象
// picture对象中存放了所有已经产生的图形对象
picture.draw(g2);
}
......

其次,Picture类的draw方法如下定义:(Picture.java)

public void draw(Graphics2D g2) {
for(int i=0;i // 使用多态性,绘制一个具体的图形对象。
Shape s = (Shape)picList.get(i);
s.draw(g2);
}
}

二、多态性带来的一些好处

当需要扩展具体图形的种类时,只需做2件事:

1、定义新的图形类,可以直接实现Shape接口,或者象例子中,继承AbstractRectShape抽象类。 这里AbstractRectShape抽象类是对所有可以通过一个矩形区域绘制的图形的抽象,它实现了Shape接口。还可以定义其它抽象类实现接口Shape,如:AbstractLine抽象类等。

比如:可以增加一个 梯形 图形,可以:

package PDemo;

import ...

public class Trapezium extends AbstractRectShape {
// 具体实现
....
}

编译该类,加入包。

2、打开ToolBar.java,在以下数组中增加一行

public Class[] shapeTypes = {
Rectangle.class,
Circle.class,
Triangle.class,
Ellipse.class
};

变成:

public Class[] shapeTypes = {
Rectangle.class,
Circle.class,
Triangle.class,
Ellipse.class,
Trapezium.class //新增的类
};

编译该类。

3、这样程序中就可以处理新的类了。

注意:其实可以通过别的方法,使第2步中,增加新类也不必修改源程序,这里由于简化程序的目的,没有实现。

运行图:


</td> </tr> <tr> <td align=right> </td> </tr> </table> </td> </tr> <tr> <td height="20" colspan="2">
   
</td> </tr> </table> </td> </tr> <tr>


↑返回目录
前一篇: jsp处理表单的一些经验分享
后一篇: 三重DES加密程序