0

私は、すべての同窓会誌を保持する xml ドキュメントを持っています。

<Magazine>
  <Volumes>
    <Volume>
      <Issues>
        <Issue>
          <Sections>
            <Section>
              <Articles>
                <Article>
                  <Images>
                    <Image>
                    </Image>
                    ...
                  </Images>
                </Article>
                ...
              </Articles>
            </Section>
            ...
          </Sections>
        </Issue>
        ...
      </Issues>
    </Volume>
    ...
  </Volumes>
</Magazine>

Volume、Issue、Section、Article、および Image のクラスを作成しました。

私の質問は次のとおり
です。スーパークラスとサブクラスの階層を作成する必要がありますか?
つまり、画像は記事を継承しますセクションは継承します問題はボリュームを継承し
ます

すなわち -- Volume.Issues、Issue.Sections、Section.Articles、Article.Images
または
私が完全に認識していない何か?

これらの選択肢の長所/短所/欠点は何ですか?

編集: 問題オブジェクトを使用している場合は、巻番号と巻年、および各セクションの記事タイトルも知る必要があります。

4

3 に答える 3

0

正確な答えは、アプリケーションでこのデータをどのように使用する予定か、データがどのように保存されるか、どのように表示されるかなどを知っている場合のみです。

通常、article は便利な開始点クラスです (ブログ投稿などと同様)。Magazine 内の Article は必要ありません (むしろ MagazineIssue)。

    //search all articles in some Magazine issue
    public IList<Article> GetArticles(long ISBN, string issueNumber)
    {
        //implementation
    }

場合によっては、Section クラスも必要ありません。

public class Article
{
    //can be immutable
    public MagazineIssueView Issue { get; set; }

    public string Author { get; set; }

    public IList<Section> Sections { get; set; }

    public IList<Image> GetAllArticleImages()
    {
        return Sections
            .SelectMany<Section, ContentBlock>(s => s.SectionContent)
            .Where(c => c is Image)
            .Cast<Image>()
            .ToList();
    }
}

public class MagazineIssueView
{
    public long ISBN { get; set; }

    //if you have internal Magazines list, it can be also internal MagazineId
    public string MagazineName { get; set; }

    public DateTime IssueDate { get; set; }

    public string IssueNumber { get; set; }
}

public class Section
{
    public string SectionTitle { get; set; }
    public int Order { get; set; }

    public IList<ContentBlock> SectionContent { get; set; }
}

public abstract class ContentBlock
{
}

public class Image: ContentBlock
{
}

public class Paragraph: ContentBlock
{
}
于 2012-05-17T15:39:58.363 に答える
0

すべてのクラスに共通のプロパティ/メソッドがある場合、継承を使用できます。そうでない場合、継承は無意味になります。

Linq To XMLクラスにマッピングせずに xml ドキュメントから必要なすべてのデータを取得するために使用することもLinq to Object、マッピング後に使用することもできます。

于 2012-05-17T15:29:04.513 に答える
0

あなたの場合、継承は完全に間違っているように聞こえます。ドメイン クラス間に自然な階層関係が存在する場合にのみ使用してください。古典的な例は、

-Employee 
--Contractor
--Permanent

それらはすべて、名前、住所、および同様のメソッド (hire()、fire()、pay() など) を必要とします。

あなたの場合、継承する関係はありません。これは、継承よりも構成を優先する必要がある理由の古典的な例です。

画像は記事ではありませんが、記事には画像があります。これは、構造全体に適用できます。

「ある」ではなく「ある」がすべてです。

于 2012-05-17T15:35:57.447 に答える