老实说,我不确定这个标题是否正确;但我会尝试用例子解释我的问题。
说我有两个班级
public class Entity {
private static int lastID = 0;
private int ID;
private Entity(){};
public static Entity create(){
lastID++;
Entity ent = new Entity();
ent.ID = lastID;
return ent;
}
}
public class Blob extends Entity {
private int x,y;
pubic void setPos(int X,int Y){;
x = X;
y = Y;
}
}
我想与实体工厂交互的方式是
Blob b = Entity.create<Blob>();
或者那种性质的东西。
我最好的尝试是
public static <E extends Entity> E create(){
E ent = new E();
...
但是这不想工作。
答案 0 :(得分:1)
简单的工厂方法可能看起来像这样。将它保存在自己的类中(不在Entity类中)并在名称中的某个位置使用名称 Factory ,以便它具有上下文
public static final Entity getInstance(String id){
Entity instance = null;
if(id.equals("Blob")) {
instance = new Blob();
}
else if(id.equals("Another Blob")) {
instance = new AnotherBlob();
}
// more Entity types here
return instance;
}
答案 1 :(得分:1)
我担心如果不将一个类或其名称作为参数传递,就无法完成。
然后,您可以使用通用构造<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>INDEX</title>
<link href='css/style.css' rel='stylesheet' type='text/css'/>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("#put").submit(function(event) {
event.preventDefault();
$.ajax({
url: 'http://localhost/slim/reg',
type: 'POST',
crossDomain: true,
data: $("#put").serializeArray(),
success: function(data) {console.log(data); }
});
});
});
</script>
</head>
<body>
<form id="put">
Registration <br/>
username: <input type="text" name="username" id="username"/><br />
password: <input type="password" name="hash" /><br />
name: <input type="text" name="name" /><br />
email: <input type="text" name="email" /><br />
<input type="submit" />
</form>
</body>
</html>
使其类型安全并避免手动类型转换。
<E extends Entity<E>>