Расширение одного класса в графическом интерфейсе в GridWorld без изменения других, которые его используют

Я хочу изменить класс DefaultDisplay графического интерфейса GridWorld, чтобы я мог изменить изображение актера во время прогона, и, поскольку я использую файл jar кода, я создаю подкласс CustomDisplay из DefaultDisplay.

Однако, поскольку создание подкласса изменит имя, мне придется создать подклассы классов, использующих DefaultDisplay, чтобы они были обновлены для использования CustomDisplay вместо DefaultDisplay. Например, мне пришлось бы создать подкласс DisplayMap с именем CustomMap, который вместо этого:

private Display defaultDisplay = new DefaultDisplay();

сказал это:

private Display customDisplay = new CustomDisplay();

и тогда любой другой класс, который использовал DisplayMap, должен был быть изменен, чтобы использовать CustomMap. Кажется очень неэффективным создавать подклассы всех этих классов только потому, что они используют классы, которые я изменяю.

Можно ли сделать так, чтобы CustomDisplay автоматически использовалось вместо DefaultDisplay, поэтому мне нужно изменить только один класс?

Примечания

  1. Классы, о которых я говорю, не включены в обычный javadoc, но их можно найти здесь.
  2. Я проверил Extending GridWorld и нашел много информации, но ничего, что могло бы помогите с этим.

person i .    schedule 30.01.2013    source источник
comment
Вся идея наследования заключается в том, что ваш CustomDisplay класс IS-A DefaultDisplay, и, таким образом, ни один из других классов не должен знать, что вы создали его подкласс. Таким образом, нет необходимости создавать подклассы любого другого класса.   -  person Tom G    schedule 30.01.2013
comment
Кстати, см. Расширение GridWorld. Кроме того, в документах нет DefaultDisplay.   -  person Andrew Thompson    schedule 30.01.2013
comment
Сначала я проверил Extending GridWorld, я нашел много информации, но ничего, что могло бы мне помочь. И графический интерфейс не указан в официальных документах. Его можно найти в другом месте.   -  person i .    schedule 30.01.2013


Ответы (1)


Этот вопрос кажется устаревшим, но я думаю, что общий ответ может помочь любому, кто его найдет.

Вопрос касается GridWorld, простого фреймворка, используемого для обучения.

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

Применяйте объектно-ориентированное мышление. Поддерживает ли платформа введение нового класса отображения? Мы должны проверить документацию и, если это не поможет, проверить интерфейсы открытого класса фреймворка: есть ли где-нибудь метод, который устанавливает отображение? Мы могли бы изучить сетку, актера и, возможно, другие, используемые или использующие их.

Несмотря на то, что говорит ОП, есть четкое заявление (где сказал @Andrew Thompson), которое касается этого требования:

"Алгоритм рендеринга следующий:

  1. Проверьте, существует ли класс, имя которого совпадает с именем класса с добавленным суффиксом Display, и который реализует файл info.gridworld.gui. Интерфейс дисплея. Если это так, вызывается его метод рисования. Это тот же механизм, который использовался в тематическом исследовании MBS. (Если вы решите предоставить такой класс, вы должны расширить удобный класс info.gridworld.gui.AbstractDisplay, который автоматически обрабатывает масштабирование и поворот.)"

Это то, что нужно для этой проблемы.

Есть парочка "уроков".

  1. Если вы читаете документацию, которая кажется связанной (в данном случае упоминается интерфейс дисплея), и вы ее не понимаете, изучайте ее до тех пор, пока не поймете.

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

  3. Ваш учитель (по такому низкоуровневому предмету) не ставит невыполнимых задач (если только не наделал большой хлам). Итак, 2. применяется.

  4. Это связано с отладкой: наши самые серьезные ошибки возникают из-за предположений, о которых мы не знали, что сделали. Вероятно, мы сделали их из-за лени или невежества. Так что пересмотрите мышление и узнайте о задействованных методах и технологиях. Поймите, что происходит, прежде чем пытаться это изменить.

person andy256    schedule 11.07.2013