Это довольно сложная ситуация, потому что такие понятия, как "Книги", "Главы", "Разделы", могут иметь некоторые общие элементы, которые предлагают иерархию классов или реализацию общего интерфейса.
И в то же время достаточно различно, чтобы обращаться с ним как с разными классами / объектами вообще, как с требованием «чтобы нельзя было добавить главу в историю, основанную на книгах».
При концептуальном рассмотрении иерархических объектов существует несколько подходов к тому, как превратить их в код, каждый из которых лучше подходит для конкретной ситуации.
1. Состав класса
Существует класс или прототип для каждой концепции, они могут быть связаны или не связаны наследованием или интерфейсами.
Существуют внутренние коллекции элементов, и их операции могут быть ограничены,
методами.
// this one can be optional, not required,
// replaced by several parent classes,
// or replaced by interfaces
public class LibraryRootClassMaybe {
// members here
}
public class BookText extends LibraryRootClassMaybe {
// members here
} // class BookText
public class BookSection extends LibraryRootClassMaybe {
// element collection should not be public
List BookTexts;
public Book() {
this.BookTexts = new ArrayList();
}
public void addBookTest(BookText Item) {
// validation and casting from object to BookText
}
// members here
} // class BookSection
public class BookChapter extends LibraryRootClassMaybe {
// element collection should not be public
List BookSections;
public Book() {
this.BookSections = new ArrayList();
}
public void addBookTest(BookSection Item) {
// validation and casting from object to BookSection
}
// members here
} // class BookChapter
public class Book extends LibraryRootClassMaybe {
// element collection should not be public
List BookChapters;
public Book() {
this.BookChapters = new ArrayList();
}
public void addBookTest(BookText Item) {
// validation and casting from object to BookText
}
// members here
} // class Book
Этот подход хорош, когда не так много разных классов, может быть 5.
2. Шаблон дизайна дерева.
Это применимо, когда все элементы будут равны, если не похожи,
обычно один и тот же класс или интерфейс, обычно много предметов.
Это не относится к вашему делу, но,
Я должен был упомянуть, чтобы подать заявку лучше.
Обычно класс дерева / иерархической коллекции, его используемый.
Это может быть подкласс коллекции родового / шаблонного дерева,
или подкласс базовой коллекции Tre,
он предназначен для замены дочерними классами с конкретными членами.
public class FileSystemRootClass {
public bool AmISystemRoot() {
// more
}
public bool AmIAFolder() {
// more
}
public bool AmIAFile() {
// more
}
public void addSystemRoot(string FileSystemName) {
// more
}
public void addFolder(string FileSystemName) {
// more
}
public void addFile(string FileSystemName) {
// more
}
// members here
}
3. Гибрид.
Это комбинация двух предыдущих,
используется, когда есть много связанных предметов,
его более сложный, может использовать или нет фабричные и абстрактные фабричные паттерны,
и его более распространенный пример - библиотеки визуальных элементов управления и виджетов.
import java.util.*;
public class WidgetsExample {
public static void main(String[] args) {
TreeSet <Widget> FormControls = new TreeSet<Widget>();
TextBoxWidget TextBox = new TextBoxWidget();
FormControls.add(TextBoxWidget);
ListBoxWidget ListBox = new ListBoxWidget();
FormControls.add(TextBoxWidget);
ButtonWidget Button = new ButtonWidget();
FormControls.add(Button);
} // class WidgetsExample
Вы можете заметить, что я не использовал "фабричный шаблон" и "абстрактную фабрику",
из-за необходимости больше кода.
Удачи.