我认为这足以解释我的问题:
public class Model {
public static Model [] findAllBySQL(String SQL){
//this is simplified. It should really query the DB and then fill model(s) with the DB values, and return the model(s). sql query can return more than one row
return new this(); //sytax error here
}
}
public class UserModel extends Model {
}
UserModel.findAllBySQL("firstname=john") //How do I design the above so this returns a UserModel object?
我对Java比较陌生。我的背景主要是PHP。我正在尝试创建一个简单的自制活动记录系统..我知道这是重新创建的轮子,但这就是我学习的方式:)。
编辑:大多数人都误解了我。我知道如何简单到new UserModel()
。我更改了代码以使其更清晰。
答案 0 :(得分:2)
为什么不简单地使用new
运算符
UserModel userModel = new UserModel();
要了解在java中创建对象的不同方法,请参阅以下主题:what-are-all-the-different-ways-to-create-an-object-in-java
修改强>
根据您的编辑,您可以做什么?
public static Model findBySQL(String SQL){
Model model = new Model();
// Now query in db to get data. then use setter methods of Model to set data in object
// i.e. model.setXXX(XXX);
// and finally return that model object.
return model;
}
修改2
UserModel可能有getFullName() 将名字与。连接起来 数据库中的姓氏。我会 需要能够访问此方法 直接回来的对象 来自findBySQL
您可以尝试这样:在UserModel中,
public String getFullName(){
Model model = findBySql("str='str'");
return model.getFirstName()+" "+model.getLastName();
}
答案 1 :(得分:1)
您应该使用构造函数:
public class Model {
//Constructor
public Model()
{
// Do initialization stuff here
}
}
public class UserModel extends Model {
//Constructor
public UserModel()
{
// Do initialization stuff here
}
}
要创建新对象,请按以下方式调用:
UserModel myUserModel; // Declare new object reference
myUserModel = new UserModel(); // create new object of this class
编辑:
如果您将方法声明为返回Model
数组的方法,则无法返回单个模型,您可能会返回Model
个数组,其中包含一个Model
,但不会单个对象。
例如
public static Model [] findAllBySQL(String SQL){
// find how many models do you have
Model[] models = new Model[numberOfModels];
for (Model model : models)
{
model = new Model();
//do what you want with it...
}
return models; //sytax error here
}
答案 2 :(得分:1)
听起来你需要Factory Method Pattern。如果您有Model超类和几种类型的模型,那么您可以使用createModel()方法将对象创建封装在ModelFactory类中,该方法根据方法的参数返回相应类型的Model。
class ModelFactory(){
public Model createModel(String sql, String type){
//execute SQL
if(type.equals("user")){
UserModel model = new UserModel();
//set the attributes here
return model;
}
if(type.equals("other")){
OtherModel model = new OtherModel();
//set attributes here
return model;
}
//etc
}
}
要实际获取Model对象,您现在可以:
ModelFactory factory = new ModelFactory();
Model m = factory.createModel("select * from mytable", "user");
答案 3 :(得分:0)
这就是你如何使用这个
UserModel m = new UserModel();
UserModel现在具有来自UserModel的所有函数/值+来自Model的函数/值。
实施例
public class Model {
public Model()
{
// Do initialization stuff here
}
public getVal(){
return 1+1;
}
}
public class UserModel extends Model {
public UserModel()
{
// Do initialization stuff here
}
public getValue2(){
return 2+2;
}
}
UserModel m = new UserModel();
m.getVal(); //Will return 2
m.getValue2(); // Will return 4
答案 4 :(得分:0)
你可以这样做:
import java.util.ArrayList;
import java.util.List;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class Generics<T> {
//method that returns a generic list
public List<T> findAllBySQL(String SQL) {
throw new NotImplementedException();
}
public static void main(String[] args) {
//base class that returns a list of childs
Generics result = new ExtendedGenerics(null);
List<ExtendedGenerics> genericArray = result.findAllBySQL(null);
for (ExtendedGenerics item : genericArray) {
System.out.println(item);
}
}
}
//extend base class and specify generic type
class ExtendedGenerics extends Generics<ExtendedGenerics> {
private String myMessage;
public ExtendedGenerics(String yourMessage) {
myMessage = yourMessage;
}
@Override
//overriding base method, so it return a instances list of this class
public List<ExtendedGenerics> findAllBySQL(String SQL) {
ArrayList<ExtendedGenerics> result = new ArrayList<ExtendedGenerics>();
result.add(new ExtendedGenerics("I am first"));
result.add(new ExtendedGenerics("I am second"));
result.add(new ExtendedGenerics("I am third"));
return result;
}
@Override
public String toString() {
return "ExtendedGenerics{" + myMessage + '}';
}
}
所以这样就没有必要的铸造了。 这是代码的输出:
ExtendedGenerics{I am first}
ExtendedGenerics{I am second}
ExtendedGenerics{I am third}
答案 5 :(得分:0)
您可以使用Factory Method加Java Generics:
public class Model {
public static <T> T[] findAllBySQL(String SQL, Class<T extends Model> type) {
T[] result = new T[123];
for (int i = 0; i < 123; i++) {
result[i] = type.newInstance();
}
return result;
}
}
public class UserModel extends Model {
}
Model[] rowset = UserModel.findAllBySQL("firstname=john", UserModel.class);
我认为这是简单的PHP构造的替代方法:
new $type();