2009-06-19 3 views
1

Допустим, я хочу создать абстрактную систему для подсчета разделов в документе. Я разработал два класса: Документ и Раздел, документ имеет список разделов и способ их подсчета.Могу ли я подклассифицировать абстрактный класс, который имеет еще один абстрактный класс, который также является подклассом? (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; 
} 

Теперь я хочу использовать этот код в сценариях multipe. Например, у меня есть книги с главами. Книга будет подклассом Документа, а Глава - подклассом Раздела. Оба класса будут содержать дополнительные поля и функциональные возможности, не связанные с подсчетом разделов.

Проблема заключается в том, что поскольку документ содержит разделы, а не главы, добавленная функциональность главы бесполезна для меня, она может только добавить в качестве раздела в книгу.

Я читал об удручающем, но на самом деле думаю, что это неправильный путь. Я думаю, может быть, я совсем не совсем понял.

Мой вопрос приходит к следующему: Как создать такую ​​абстрактную систему, которая может быть повторно использована подклассовыми объектами, и это путь?

+0

Хотя я согласен с тем, что ответ Джона на самом деле отвечает на ваш вопрос, я был бы склонен сделать шаг назад и спросить, может быть, вы не страдаете от того, что я называю «синдром счастья объекта». Вам действительно нужно обрабатывать документы и разделы полиморфно через большой набор возможных топологий документа/раздела? Увеличивает ли добавленная сложность и, следовательно, добавляет стоимость ваших сложных отношений типа «оплачивает себя» с точки зрения многократного повторного использования кода с помощью полиморфизма и наследования, или это просто ООП для ООП? –

+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

Большое спасибо, Джон, возился с днем ​​на целый день! Будет читать на дженериках, но, похоже, это то, что я ищу. –

Смежные вопросы