2013-06-14 2 views
1

Я просто изучаю Java, но мой вопрос связан как с Java, так и с общим.Программно объявить переменную для общего метода (без использования массива)

Моя ситуация такова: у меня есть метод, который я бы хотел использовать обычно несколькими классами через наследование. Внутри блока метода мне нужно объявить переменную вызывающего класса, создать из него объекты, которые размещены в ArrayList <> («array») вызывающего класса, и отправить результат через ObjectOutputStream («output») к сериализованному файлу.

У меня есть следующие классы:

CustomerInternalFrame.java, который поддерживает «массив» сериализованного Customer.java с использованием ArrayList типа Клиента.

ПодрядчикInternalFrame.java, который поддерживает «массив» сериализованного Contractor.java с использованием ArrayList типа Contractor.

VendorInternalFrame.java, который поддерживает «массив» сериализованного Vendor.java с использованием ArrayList типа Vendor.

В каждом из этих классов InternalFrame, у меня есть следующий метод, addRecords (заменить «Клиент» с соответствующим классом, либо Заказчик, подрядчик или поставщик):

private void addRecords() { 

    // object to be written to the file 
    Customer record; 

    // loop until end of array 
    for (Customer element : array) { 

    // check for closed streamer and invalid entries 
    try { 

     // create a new object from current fields 
     record = new Customer(
      element.getName(), 
      element.getLastName(), 
      element.getAddress1(), 
      element.getAddress2(), 
      element.getCity(), 
      element.getState(), 
      element.getZip(), 
      element.getPhone(), 
      element.getCell()); 

     // write new record 
     output.writeObject(record); 
    } // end try 
    ... (catch blocks) 
    } // end for 
} // end method 

Я думал жесткий и поиск долгое время для того, чтобы программно изменить слово «Клиент» в приведенном выше, чтобы я мог объявить один метод (или класс) addRecords() и использовать каждый из трех классов InternalFrame без необходимости дублировать код. Я, конечно, не могу заменить слово «Клиент» на «Объект» во всех случаях, потому что «Объект» не имеет моих методов getName(), getAddress1() и т. Д. Я также не могу заменить «Клиент» «Объектом() "по той же причине. (Другими словами, использование массивов - нормальное решение - в этом случае не работает, потому что мне придется использовать массив суперкласса, а затем опускать его, но downcasting требует сначала объявить первоначально названный класс. Таким образом, массив является всего лишь порочным кругом в этом случае.)

Я понимаю, что у меня есть три разных метода addRecords(), которые позволяют мне изменять любые поля, которые я записываю в соответствующем файле, так как Клиент, Подрядчик и Поставщик могут иметь различные наборы полей. Но у меня есть другие ситуации, которые похожи, где вещи, которые я делаю в коде, идентичны, но вызываются разными классами (например, аналогичными обработчиками событий), и было бы неплохо узнать, есть ли что-то вроде этого может быть сделано вообще.

Итак, есть ли способ изменить тип переменной, в том числе путем передачи одного метода методу или конструктору, чтобы несколько классов могли использовать один и тот же код для создания объектов этих конкретных классов?

+1

Пожалуйста, задайте более короткий вопрос – nachokk

+0

Это будет работать только в том случае, если три класса имеют одинаковые методы, в другом случае они не являются полиморфными, поэтому вы не знаете, какой метод вызывать для установки/получения каждого атрибута в каждом типе , возможно, вы можете передать массив с каждым параметром, и каждый класс имеет общий метод, такой как setAttributes, который считывает массив по каждому значению – DGomez

+1

Вместо 'new Customer (...)', почему бы не 'element.clone()' ? – Eric

ответ

5

сделать базовый класс родовое так:

public abstract class InternalFrame<T> { 

    protected abstract Collection<? extends T> getElements(); 

    protected abstract Serializable getRecord(final T t); 

    public void serialize(final File file) { 
     try (final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) { 
      for(final T t : getElements()) { 
       oos.writeObject(getRecord(t)); 
      } 
     } catch (IOException ex) { 
      //handle 
     } 
    } 
} 

, а затем в вашем классе-вам просто необходимо реализовать abstract методы

public class CustomerFrame extends InternalFrame<Customer> { 

    @Override 
    protected Collection<? extends Customer> getElements() { 
     return array; 
    } 

    @Override 
    protected Serializable getRecord(Customer element) { 
     return new Customer(
     element.getName(), 
     element.getLastName(), 
     element.getAddress1(), 
     element.getAddress2(), 
     element.getCity(), 
     element.getState(), 
     element.getZip(), 
     element.getPhone(), 
     element.getCell()); 
    } 

} 

И вы могли бы назвать метод serialize(final File file), чтобы написать записи до File.

Смежные вопросы