2015-08-14 2 views
1

У меня есть класс классов POJO, который имеет одну функциональность, например readCSV метод. Поэтому я хочу использовать один родительский (или, может быть, абстрактный, не уверенный, должен ли он быть) класс, что эти POJO могут расширяться. Вот псевдо-код:Java - общий класс, расширенный конкретным классом

(abstract) class CSVUtil { 

    private String[] fileHeader = null; 

    protected void setFileHeader(fileHeader) { 
     this.fileHeader = fileHeader; 
    } 

    protected List<WhateverChildClass> readCSV(String fileName) { 

     // read CSV using Apache Commons CSV 
     // and return a List of child type 

     List<WhateverChildClass> list = null; 
     // some declarations 

     try { 

      list = new ArrayList<WhateverChildClass>(); 

      csvParser = new CSVParser(fileReader, csvFormat); 

      List csvRecords = csvParser.getRecords(); 

      for (...) { 
       CSVRecord record = (CSVRecord) csvRecords.get(i); 

       WhateverChildClass childClass = new WhateverChildClass(); 

       // loop through fields of childClass using reflection and assign 
       for (// all fields of childClass) { 
        childClass.setWhateverField(record.get(fileHeader[i])); 
       } 

       list.add(childClass); 

       System.out.println(p); 
       ps.add(p); 
      } 
     } 
     ... 

     return list; 
    } 
} 

на одном из дочерних классов, скажем childâ

class ChildA extends CSVUtil { 

    // fields, getters, setters 

} 

Как закодировать CSVUtil таким образом, что я могу определить, в среде выполнения дочернего класса в readCSV, определенный в родительском классе?

Можно ли сделать этот метод статическим и все еще унаследованным?

В качестве альтернативы, есть API в Apache Commons CSV, который обычно может читать CSV, определять его схему и обертывать ее как общий объект (я не знаю, если я здесь понимаю) и вернуть список что бы это ни было?

ответ

1

Вы хотите, чтобы readCSV был статическим методом?

Тогда, я бы сказал, что childâ класс не должен наследовать от CSVUtil, но реализовать интерфейс ... что-то вроде этого:

public final class CSVUtil { 

    private CSVUtil() { 
    } 

    public static <T extends ICSV> List<T> readCSV(String filename) { 
    ... 
    } 


class ChildA implements ICSV 
Смежные вопросы