类结构是这样
基类为WINDOW
继承类为SUBWINDOW1与继承类为SUBWINDOW2
问题:
我想做一个通用的函数,来实现给dotest一个参数,例如该参数是SUBWINDOW1,该函数内就创建SUBWINDOW1的一个实例。SUBWINDOW2类似。请问怎么写
protected void doTest(WINDOW){
SUBWINDOW1 sb=new SUBWINDOW1()}
dotest(SUBWINDOW1)
基类为WINDOW
继承类为SUBWINDOW1与继承类为SUBWINDOW2
问题:
我想做一个通用的函数,来实现给dotest一个参数,例如该参数是SUBWINDOW1,该函数内就创建SUBWINDOW1的一个实例。SUBWINDOW2类似。请问怎么写
protected void doTest(WINDOW){
SUBWINDOW1 sb=new SUBWINDOW1()}
dotest(SUBWINDOW1)
解决方案 »
- 并发线程的问题
- ResultSet is closed异常
- 关于Swing中JTextPane,Document,Style,Element的问题
- java 中有没有一种组件,,能够取得当前行的,就像写字板,,,一样
- 迷惑中!窗口刚启动时,标题栏是活动状态的。并且焦点也在JtextField闪动,但就是输不了值!
- 如何在java中实现context help 谢谢。
- 如何让两个Panel都能响应键盘消息?
- exception的规划
- 请问,一般用java做什么?
- java有现成的class提供POST一个请求到web页吗?
- 关于异常处理
- 【菜鸟求问】命令行编程,一次性javac src目录下树形结构的所有.java源文件
protected void doTest(SUBWINDOW1 w1){
SUBWINDOW1 sb=new SUBWINDOW1()
}protected void doTest(SUBWINDOW2 w2){
SUBWINDOW2 sb=new SUBWINDOW2()
}方法重构
不要定义
protected void doTest(WINDOW){
}
这个方法
public void dotest(Window w) {
if(w instanceof SubWindow1) {
SubWindow1 s1 = new SubWindow1();
} else if(w instanceof SubWindow2) {
SubWindow2 s2 = new SubWindow2();
}
}
}
if (win instanceof SUBWINDOW1) {
SUBWINDOW1 sb=new SUBWINDOW1();
} else if (win instanceof SUBWINDOW2) {
SUBWINDOW2 sb=new SUBWINDOW2();
}
}
基类为WINDOW
继承类为SUBWINDOW1与继承类为SUBWINDOW2
System.out.println("It's Window");
}}class SubWindow1 extends Window { public void printType() {
System.out.println("It's SubWindow1");
}}class SubWindow2 extends Window { public void printType() {
System.out.println("It's SubWindow2");
}}public class WindowTest { /**
* 你要的doTest函数
*
* @param <T>
* @param clazz
*/
public static <T extends Window> void doTest(Class<T> clazz) {
try {
Window win = clazz.newInstance();
win.printType();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
doTest(Window.class);
doTest(SubWindow1.class);
doTest(SubWindow2.class);
}
}
可以使用Composite模式,或者Decorator模式的设计方式
当然也可以自己使用反射方式来判断参数的具体类型
/**
* 你要的doTest函数
*
* @param <T>
* @param clazz
*/
public static <T extends Window> void doTest(T win) {
try {
Window newWin = win.getClass().newInstance();
newWin.printType();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
doTest(new Window());
doTest(new SubWindow1());
doTest(new SubWindow2());
}
}class SubWindow1 extends Window {
public static void printType() {
System.out.println("It's SubWindow1");
}
}class SubWindow2 extends Window {
public static void printType() {
System.out.println("It's SubWindow2");
}
}public class WindowTest {
/**
* * 你要的doTest函数 * *
*
* @param <T> *
* @param clazz
*/
public static <T extends Window> void doTest(Class<T> clazz) {
try {
//是静态函数如何调用?
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
doTest(SubWindow1.class);
}
}
package com.csdn;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public abstract class Window {
static Window doTest(String className) throws ClassNotFoundException,
SecurityException, NoSuchMethodException, IllegalArgumentException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
Class<?> obj = Class.forName(className);
Class<?>[] parameterType = null;
Constructor co = obj.getConstructor(parameterType);
Object[] initArgs = null;
Window d = (Window) co.newInstance(initArgs);
return d;
} abstract void testPrint();
}//===========================================
package com.csdn;public class SubWindow extends Window { void testPrint(){
System.out.println("aaa");
}
}//===========================================
package com.csdn;public class SubWindow2 extends Window {
@Override
void testPrint() {
// TODO Auto-generated method stub
System.out.println("bbb");
}
}//========================test===================
package com.csdn;public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Window.doTest("com.csdn.SubWindow").testPrint();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这又是何必呢,都new出来了,直接用呗
System.out.println("It's Window");
} public static void printType2() {
System.out.println("static printType2 It's Window");
}}class SubWindow1 extends Window { public void printType() {
System.out.println("It's SubWindow1");
} public static void printType2() {
System.out.println("static printType2 It's SubWindow1");
}}class SubWindow2 extends Window { public void printType() {
System.out.println("It's SubWindow2");
} public static void printType2() {
System.out.println("static printType2 It's SubWindow2");
}
}public class WindowTest { /**
* 你要的doTest函数
*
* @param <T>
* @param clazz
*/
public static <T extends Window> void doTest(Class<T> clazz) {
try {
Window win = clazz.newInstance();
clazz.getMethod("printType2").invoke(null);
win.printType();
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
doTest(Window.class);
doTest(SubWindow1.class);
doTest(SubWindow2.class);
}
}