Я просто изучаю 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(), которые позволяют мне изменять любые поля, которые я записываю в соответствующем файле, так как Клиент, Подрядчик и Поставщик могут иметь различные наборы полей. Но у меня есть другие ситуации, которые похожи, где вещи, которые я делаю в коде, идентичны, но вызываются разными классами (например, аналогичными обработчиками событий), и было бы неплохо узнать, есть ли что-то вроде этого может быть сделано вообще.
Итак, есть ли способ изменить тип переменной, в том числе путем передачи одного метода методу или конструктору, чтобы несколько классов могли использовать один и тот же код для создания объектов этих конкретных классов?
Пожалуйста, задайте более короткий вопрос – nachokk
Это будет работать только в том случае, если три класса имеют одинаковые методы, в другом случае они не являются полиморфными, поэтому вы не знаете, какой метод вызывать для установки/получения каждого атрибута в каждом типе , возможно, вы можете передать массив с каждым параметром, и каждый класс имеет общий метод, такой как setAttributes, который считывает массив по каждому значению – DGomez
Вместо 'new Customer (...)', почему бы не 'element.clone()' ? – Eric