1

我有以下模型:

abstract Article {id, name, text}

final NewspaperArticle { printDate } extends Article

final ScientificArticle { quotations, publicationDate } extends Article

final ... { ... } extends Article

我想知道如何在彼此之间实现最终实体的转换,以便设置 Article 超类的公共字段并且不同的字段保持为空。就像是:

ScientificArticle scientificArticle = ...;
NewspaperArticle newspaperArticle = new NewspaperArticle();
newspaperArticle.copyOf(scientificArticle);

是否可以投射它或者我将不得不使用反射?

4

2 回答 2

2

你不能这样做,因为正如你所说,NewspaperArticle 有一些 ScientificArictle 没有的信息(例如字段)。我也不知道你想如何通过反思来实现这一目标。即使你可以,如果你不得不依赖这些东西,那将是糟糕的类设计的标志。

于 2012-04-07T09:18:49.340 回答
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);
于 2012-04-07T09:30:09.733 回答