只要看过OSWorkflow的抽象接口AbstractDescriptor方法的人,我相信你们的心情和我一样的糟糕!!而让我心情如此糟糕的原因就出在XMLizable这个接口上,我们来看看这个接口的定义
/*
* Copyright (c) 2002-2003 by OpenSymphony
* All rights reserved.
*/
package com.opensymphony.workflow.util;
import java.io.PrintWriter;
import java.io.Serializable;
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision: 1.2 $
*/
public interface XMLizable extends Serializable {
//~ Static fields/initializers /////////////////////////////////////////////
public static final String INDENT = " ";
//~ Methods ////////////////////////////////////////////////////////////////
public void writeXML(PrintWriter writer, int indent);
}
问题就出现在writeXML方法!这就等于是用户希望你把生成的xml文件给他,而你却说:给什么,从控制台COPY一份嘛,笨蛋!
动手修改了AbstractDescriptor方法的实现,而实现的方法很简单-屏蔽writeXML方法(在这里我发现抽象类实现某个接口的时候,不需要去实现接口的方法!),并为其提供getXML方法。
/*
* Copyright (c) 2002-2003 by OpenSymphony
* All rights reserved.
*/
package com.company.workflow.loader;
import com.opensymphony.workflow.util.XMLizable;
import java.io.PrintWriter;
import java.io.Serializable;
/**
* AbstractDescripter
* @author killvin@hotmail.com
*/
public abstract class AbstractDescriptor implements XMLizable, Serializable {
//~ Instance fields ////////////////////////////////////////////////////////
private AbstractDescriptor parent;
private boolean hasId = false;
private int id;
//~ Methods ////////////////////////////////////////////////////////////////
public void setId(int id) {
this.id = id;
hasId = true;
}
public int getId() {
return id;
}
public void setParent(AbstractDescriptor parent) {
this.parent = parent;
}
public AbstractDescriptor getParent() {
return parent;
}
public boolean hasId() {
return hasId;
}
/**
* @deprecated getXML();
*/
public void writeXML(PrintWriter writer, int indent)
{
}
/**
* get xml descripter
* @return
*/
public abstract String getXML();
}
总结
1。接口的定义来源于对类方法级别的抽象,没有高层次的抽象能力就先不要抽象接口,免得害人。
2。抽象类实现了接口,并不需要你去实现接口声明的方法-JAVA语法