2009-06-19 8 views
1

文書のセクションを数えるための抽象システムを設計したいとします。 文書セクションという2つのクラスを設計しました。この文書にはセクションのリストとそれらを数える方法があります。サブクラス化された別の抽象クラスを持つ抽象クラスをサブクラス化することはできますか? (C#)

public abstract class Document { 
    List<Section> sections; 

    public void addSection(Section section) { 
    sections.Add(section); 
    } 
    public int sectionCount() { 
    return sections.count; 
    } 
} 
public abstract class Section { 
    public string Text; 
} 

ここで、このコードをマルチプルシナリオで使用できるようにしたいと考えています。たとえば、私は章付きの本を持っています。 BookはDocumentのサブクラスであり、ChapterはSectionのサブクラスです。両方のクラスには、セクションのカウントとは無関係に、余分なフィールドと機能が含まれます。

私が今直面する問題は、チャプターではなくセクションが含まれているため、チャプターの追加機能が役に立たないことです。ブックにはセクションとしてしか追加できません。

私はダウンキャスティングについて読んでいましたが、実際にはこれは正しい方法ではないと思います。多分私が間違ったアプローチをとったのかもしれないと思っています。

私の質問はこうです:サブクラス化されたオブジェクトによって再利用できる抽象的なシステムをどのように設計すればよいのでしょうか?

+0

私はJonの答えが実際にあなたの質問に答えることに同意しますが、私はここで一歩踏み出し、 "Object Happiness Syndrome"と呼ばれるものに少し苦しんでいないか尋ねます。 _可能なドキュメント/セクショントポロジの大規模なセット全体で、ドキュメントとセクションを多態的に扱う必要がありますか?追加された複雑さとそれに伴う複雑な型の関係の追加コストは、多形性や継承による大規模なコードの再利用という点で "それ自身を支払う"のですか、それともOOPのためのOOPですか? –

+0

エリック、そうかもしれない。おそらくそれはずっと多くのものになっていて、私はずっと複雑になっています。私は実際に自分自身について疑問を抱いていました。しかし、私はこれが本当であるかどうかを知る知識がないと感じています。私が本当に達成したいのは、抽象的な「システム」を持っていることです。再利用することができ、例えば永続性のようなものにうんざりすることはありません。前述のケースでは、本は、(ORMを使用して)それ自体を持続することができるという追加の機能性を有するであろう。 –

答えて

6

あなたはジェネリック医薬品を必要とする:

public abstract class Document<T> where T : Section 

public abstract class Section 

public class Book : Document<Chapter> 

public class Chapter : Section 

あなたはセクションでは、それはの一部にすることができ、文書の種類を知るようにしたいかもしれません。残念ながら、それは多くの複雑になる:

public abstract class Document<TDocument, TSection> 
    where TDocument : Document<TDocument, TSection> 
    where TSection : Section<TDocument, TSection> 

public abstract class Section<TDocument, TSection> 
    where TDocument : Document<TDocument, TSection> 
    where TSection : Section<TDocument, TSection> 

public class Book : Document<Book, Chapter> 

public class Chapter : Section<Book, Chapter> 

私はプロトコルバッファでこれを行うために持っていた、そしてそれは厄介だ - しかし、それはあなたが強く型付けされた方法で、両方の方法を参照することができません。あなたがそれを手放すことができるなら、私は最初のバージョンに行くだろう。

+0

Jonさん、ありがとうございました。ジェネリックスを読み上げますが、それは私が探しているようです。 –

関連する問題