Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-从抽象类创建对象实例_Java_Android_Oop - Fatal编程技术网

java-从抽象类创建对象实例

java-从抽象类创建对象实例,java,android,oop,Java,Android,Oop,我有一个表示数据库记录的抽象记录类,它有两个抽象方法:getTable()和getColumns()。然后我有一个扩展Record的Customer类,并在这个类中实现这些抽象方法 我试图弄清楚如何获得所有客户的列表,但要尽可能保持该方法的可重用性,因此我更喜欢getAllRecords(Record Record)方法,而不是getAllCustomers()方法 这是我到目前为止所做的。我无法创建新的Record()对象,因为它是抽象的,需要创建传入的类的实例 //i'd like to d

我有一个表示数据库记录的抽象记录类,它有两个抽象方法:getTable()和getColumns()。然后我有一个扩展Record的Customer类,并在这个类中实现这些抽象方法

我试图弄清楚如何获得所有客户的列表,但要尽可能保持该方法的可重用性,因此我更喜欢getAllRecords(Record Record)方法,而不是getAllCustomers()方法

这是我到目前为止所做的。我无法创建新的Record()对象,因为它是抽象的,需要创建传入的类的实例

//i'd like to do something like this to get all of the Customers in the db 
// datasource.getAllRecords(new Customer());

public List<Record> getAllRecords(Record record) {
    List<Record> records = new ArrayList<Record>();

    Cursor cursor = database.query(record.getTable(),
        record.getColumns(), null, null, null, null, null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
      Record record = cursorToRecord(cursor, record);
      records.add(record);
      cursor.moveToNext();
    }
    // Make sure to close the cursor
    cursor.close();
    return records;
  }

  private Record cursorToRecord(Cursor cursor, Record record) {


    Record record = new Record(); <-- somehow clone a new instance of the record that was passed in

    record.setId(cursor.getLong(0));
    record.setValue("aKey",cursor.getString(1));
    return record;
  }
//我想做一些类似的事情来获得数据库中的所有客户
//getAllRecords(新客户());
公共列表getAllRecords(记录){
列表记录=新的ArrayList();
Cursor Cursor=database.query(record.getTable(),
record.getColumns(),null,null,null,null,null);
cursor.moveToFirst();
而(!cursor.isAfterLast()){
记录记录=光标或记录(光标,记录);
记录。添加(记录);
cursor.moveToNext();
}
//确保关闭光标
cursor.close();
退货记录;
}
专用记录光标或记录(光标光标,记录记录){

Record Record=new Record();一个奇怪的用例。我会将
cursorToRecord
方法抽象化。这会将逻辑推送到每个类中,这些类知道如何从
游标构建自己

public abstract Record cursorToRecord(Cursor cursor, Record record);

不直接回答你的问题,但看看内容提供商的Android指南()。它们允许灵活的数据访问和其他好处。我发现它们值得最初的学习和设置工作(特别是使用w/Loader时)

您可以获得
记录的类,前提是
记录的所有子类都将具有无参数构造函数

Record newRecord = record.getClass().newInstance();
请注意,您可以只传递类而不是对象本身

您还可以传递一个工厂,该工厂将负责实例化正确的类

interface RecordFactory {
    Record create();
}

class CustomerFactory implements RecordFactory {
    Record create() {
        return new Customer();
    }
}

public List<Record> getAllRecords(RecordFactory factory) {
    ...
    for(...) {
        ...
        Record record = factory.create();
        ...
    }
    ...
}
接口记录工厂{
记录创建();
}
类CustomerFactory实现RecordFactory{
记录创建(){
返回新客户();
}
}
公共列表getAllRecords(RecordFactory工厂){
...
对于(…){
...
Record=factory.create();
...
}
...
}
反射呢

Record newRecord = record.getClass().newInstance();

Record类是否有可以实例化的子类?Customer是一个扩展Record并可以实例化的类,是的。是的,我考虑过这样做。看起来有点混乱though@David经过深思熟虑,我最初的建议有点不确定。请参见上面的编辑。hmmm我希望将我的模型保持为数据源不可知possible@DavidB当然,每个新的子类都会引入额外的列等。一个方法如何在不知道这些信息的情况下构造不同的对象?我想你有一个观点。我有静态的最终变量来定义扩展记录的类中的表和列。我想我是在告诉自己“列”可以只表示应该提交给数据源(数据库或API)和“表”的键/值对这是我使用的资源我明白了谢谢这是我想要的needed@David正如在这个问题中所指出的,这是一个脆弱的设计,如果没有一个ARG构造函数,它将在运行时失败。我敦促您考虑这种方法是否真的是您想要做的。它不觉得非常“java”。.ooh我想我不明白。在我的子类中,我需要一个空的构造方法?你有一个更“Java”的方法想法吗?@David工厂方法更“Java”。我添加了一个示例。所以我需要为扩展我的记录类的每个类编写几个单独的工厂类?是这样吗?
Record newRecord = record.getClass().newInstance();