Моя цель заключается в следующем.
Я работаю с белками в условиях анализа данных. Данные, доступные для любого данного белка, являются переменными. Я хочу быть в состоянии построить класс белка из более простых родительских классов. Каждый родительский класс будет определенным для уровня данных, который у меня есть.
Различные проекты могут иметь разные слои данных. Я хотел бы написать простые классы для белка, которые содержат все переменные и методы, связанные с конкретным слоем данных. И затем, для любого данного проекта, можно составить проектный класс белка, который наследуется от соответствующих классов белка, специфичных для уровня данных.
Кроме того, для каждого класса белка, специфичного для уровня данных, требуется аналогичный класс цепи, уровень остатка и класс атома. Они все строительные блоки. Атомы используются для создания остатков, которые используются для построения цепей, которые используются для создания белка. Класс белка должен иметь доступ ко всем его атомам, остаткам и цепям. Точно так же цепочки нуждаются в доступе к остатку и атомам.
Я использовал векторы и карты для хранения указателей на соответствующие объекты. Существуют также соответствующие методы get и set. Чтобы дать КАЖДУЮ версию переменных белка и методов получения и установки, я сделал 1 шаблонный класс для атома, остатка, цепи и белка. Этот шаблонный класс содержит векторы и методы получения и установки, которые предоставляют белку доступ к его цепям, остаткам и атомам. Этот шаблонный класс затем наследуется каждым классом белка определенного уровня данных.
Это лучший подход?
Прежде всего, использование наследования является хорошим способом абстракции и должно помочь вам создавать собственные классы, легко прокладывая путь для повторного использования и обслуживания. Однако вы можете уделить время рассмотрению ваших структур данных. Использование вектора кажется наиболее естественным способом применения динамического Однако данные, изменяющие размеры векторов, имеют некоторые накладные расходы, и иногда при работе с большими данными это становится проблемой.
Чтобы преодолеть это, попробуйте найти среднее количество данных, которое у каждого обычно было бы. Так что вы можете иметь массив и вектор, и вы можете использовать вектор только тогда, когда закончите работу с массивом. не сталкивайтесь слишком часто.
В зависимости от фактической обработки, которую вы собираетесь сделать, вы можете переосмыслить свои структуры данных. Если, например, ваши данные достаточно малы и управляемы, вы можете просто использовать векторы и больше концентрироваться на реальном вычислении. наборы данных должны быть обработаны, вы можете немного изменить свои структуры данных, чтобы сделать обработку проще. Удачи.
Вы можете посмотреть на Композитный дизайн шаблона организовать ваши многоуровневые данные и Шаблон дизайна посетителя написать алгоритмы, которые «посещают» вашу структуру данных.
Composite Design Pattern создает интерфейс Component (абстрактный базовый класс), который позволяет выполнять итерацию по всем элементам своего подслоя, добавлять / удалять элементы и т. Д. Он также должен иметь accept(some_function)
метод, позволяющий применять внешние алгоритмы к себе. Каждый конкретный слой (атом, остаток, цепь) будет тогда конкретным классом, который наследуется от интерфейса Компонента. Не позволяйте слою наследоваться от его подслоя: наследование должно отражать только отношения «есть», за исключением особых обстоятельств.
Шаблон проектирования посетителей создает иерархию алгоритмов, которая не зависит от точной структуры ваших данных. Этот шаблон работает лучше всего, если иерархия классов ваших данных не изменится в обозримом будущем. [ПРИМЕЧАНИЕ: вы все равно можете получить любую молекулу, какую захотите, заполнив структуру вашими данными, только не меняйте количество слоев в вашей структуре].
Независимо от того, что вы делаете, всегда рекомендуется использовать наследование только для повторного использования или расширения интерфейса, а также использовать композицию для повторного использования / расширения данных. Например. контейнеры STL, такие как vector
а также map
не имеют виртуальных деструкторов и не предназначены для использования в качестве базовых классов.