1

私は次のモデルを持っています:

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);

それをキャストすることは可能ですか、それともリフレクションを使用する必要がありますか?

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)次に、記事データフィールドを設定し、他のフィールドをnullのままにするコンストラクターを各クラスに追加できます。

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 に答える