我有以下型号:
abstract Article {id, name, text}
final NewspaperArticle { printDate } extends Article
final ScientificArticle { quotations, publicationDate } extends Article
final ... { ... } extends Article
我想知道如何在彼此之间实现最终实体的转换,以便设置Article超类的公共字段,并且不同的字段将保持为null。类似的东西:
ScientificArticle scientificArticle = ...;
NewspaperArticle newspaperArticle = new NewspaperArticle();
newspaperArticle.copyOf(scientificArticle);
是否可以施放它,否则我将不得不使用反射?
答案 0 :(得分:2)
你不能这样做,因为正如你所说,NewspaperArticle有一些科学武器没有的信息(例如字段)。我也不知道你想用反射实现这一目标。即使你可以,如果你不得不依赖这样的东西,这将是一个糟糕的阶级设计的标志。
答案 1 :(得分:1)
简短地回答你的问题:不,你不能将一个对象强制转换为另一个类。您可能只会转换为对象真实类的超类型。 (一个类本身也是一种超类型。)
但是,您可以使用合成而不是继承:
interface Article { ArticleData getArticleData(); }
final ArticleData {id, name, text}
final NewspaperArticle { articleData, printDate } implements Article
final ScientificArticle { articleData, quotations, publicationDate } implements Article
final ... { articleData, ... } implements Article
然后你可以为每个类添加一个像NewspaperArticle(Article createFrom)
这样的构造函数来设置文章数据字段,并将其他字段留空:
class NewspaperArticle {
ArticleData articleData;
Date printDate = null;
NewspaperArticle(Article createFrom) {
this.articleData = createFrom.getArticleData();
}
}
您的示例将如下所示:
ScientificArticle scientificArticle = ...;
NewspaperArticle newspaperArticle = new NewspaperArticle(scientificArticle);