Описание проблемы
У меня есть абстрактный класс Paper
, который содержит общие свойства всех документов и один или несколько дочерних классов бумаги, которые добавляют дополнительную информацию для этого типа бумаги. Затем у меня есть HashMap<String, Paper>
для хранения нескольких бумаг.
Мое приложение позволяет пользователю обновлять бумагу, предоставляя pid
и затем предоставляя атрибуты и значения для обновления. У меня проблема в том, как обновить свойства подклассов, когда у меня есть только суперкласс.
Как лучше всего справиться с этой ситуацией?
Структура класса
public abstract class Paper {
String pid;
String title;
String author;
}
public class Publication extends Paper {
int pages;
}
public class PHDThesis extends Paper {
String supervisor;
}
Моя текущая попытка
Это то, что у меня сейчас **, и оно работает с использованием instance of
; но я чувствую, что должен быть лучший способ сделать это.
import java.util.*;
public class App {
public static abstract class Paper {
private String title;
private String author;
public Paper(String title, String author) {
this.title = title;
this.author = author;
}
public void update(String title, String author) {
this.title = title;
this.author = author;
}
}
public static class Publication extends Paper {
private int pages;
public Publication(int pages, String title, String author) {
super(title, author);
this.pages = pages;
}
public void update(String title, String author, int pages) {
super.update(title, author);
this.pages = pages;
}
}
public static class PHDThesis extends Paper {
private String supervisor;
public PHDThesis(String supervisor, String title, String author) {
super(title, author);
this.supervisor = supervisor;
}
public void update(String title, String author, String supervisor) {
super.update(title, author);
this.supervisor = supervisor;
}
}
public static void main(String[] args) {
HashMap<String, Paper> papers = new HashMap<String, Paper>();
papers.put("P001", new PHDThesis("My Super", "My PHD Title", "My Author"));
papers.put("P002", new Publication(22, "My Pub Title", "My Author"));
Paper p = papers.get("P001");
if (p instanceof PHDThesis) {
((PHDThesis)p).update("New Title", "New author", "New Super");
} else if (p instanceof Publication) {
((Publication)p).update("New Title", "New author", 33);
}
}
}
** сокращен тестовый код, реальный код гораздо сложнее и лучше продуман.