Рассмотрение иерархии - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть игра, которую я делаю, которая имеет текущую иерархию классов GenerateStats -> ClassStats -> CreateCharacter. Я чувствую, как будто это может идти назад. Статистика не имеет статистики классов, а статистика классов не имеет символов. Я иду назад? Должно ли это быть CreateCharacter -> ClassStats -> GenerateStats? Спасибо за ваш вклад!

Ответы [ 4 ]

9 голосов
/ 29 ноября 2011

Ничто из этого не имеет смысла в иерархии классов;иерархии классов представляют собой «своего рода» отношения между существительными;те вещи, которые вы перечислили, являются глаголами.Это должны быть методы класса.Класс должен быть CharacterGenerator .

0 голосов
/ 29 ноября 2011

Перефразируя (как указал Эрик, использование глаголов вводит в заблуждение), я считаю, что ваш вопрос:

Должен ли CharacterGenerator быть своего рода ClassGenerator, который сам должен быть своего рода StatsGenerator? Несколько соображений:

  1. Есть ли у вас другие типы вещей, которые вы ожидаете получить от ClassGenerator или StatsGenerator? Если нет, вам не нужно наследование.

  2. У вас есть другой код, который хочет использовать любой StatsGenerator или любой ClassGenerator? Если у вас нет кода, который работает с использованием базовых классов, вам не нужны базовые классы.

Основываясь на именах, я думаю, что вы действительно пытаетесь описать композиционные отношения. Посмотрите, звучит ли это выражение скорее как то, что вы пытаетесь сделать:

У вас есть CharacterGenerator, который использует ClassGenerator для генерации класса персонажа и StatsGenerator для генерации статистики персонажа. В результате получается персонаж, содержащий класс и статистику.

Существует множество способов моделирования и решения проблем при программировании; Лучше всего предпочесть самый простой подход, а отношения наследования добавляют сложность. У вас должна быть веская причина для введения этой сложности, если вы планируете ее использовать.


Кроме того, как уже отмечали другие, вам не обязательно определять класс для составного поведения. В некоторых случаях достаточно метода или нескольких методов. Тем не менее, не обязательно плохо ошибаться на стороне «слишком маленьких» (маленьких классов с несколькими методами), а не «слишком больших» (нескольких гигантских классов, полных всевозможных методов). Найти правильный баланс сложно так что экспериментируйте.

0 голосов
/ 29 ноября 2011

Из того, что я вижу, ты не уйдешь назад. Наследование становится более конкретным - например, Apple наследуется от Fruit (который реализует IEdible!), Который наследует Object. А не наоборот. Конечно, не совсем очевидно, в каком направлении движутся ваши классы, поэтому я не уверен. Просто убедитесь, что базовый класс наименее специфичен, а производные классы более специфичны, чем базовые классы. Признаком того, что вы делаете это неправильно, является то, что вы часто используете теневые методы, используя private new xxx MyFunction() { //....

0 голосов
/ 29 ноября 2011

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

...