Новые классы, созданные пользователями? - PullRequest
6 голосов
/ 28 января 2010

Рассмотрим следующую ситуацию: у меня есть симулятор аквариума, где у меня есть 5 различных видов рыб. Разные типы означают разные атрибуты (скорость, цвет, голод и т. Д.). Что если я хочу, чтобы пользователь моего симулятора смог создать новый тип рыбы и присвоил ей значения для ее атрибутов?

Как это реализовано программистом? Нужна ли какая-то «обработка событий», которая добавит определенный набор строк кода в мой класс «Fish»? Это даже правильная мысль?

(В случае, если это важно, язык является Java. И чтобы избежать недоразумений и предотвратить комментарии типа «это работа универмага?», Да, это так. Но я не ищу ответа, мне любопытно понятие .)

РЕДАКТИРОВАТЬ: Да, плохо, что я не упомянул способ взаимодействия: графический интерфейс.

Итак, представьте вкладку «Добавить новые виды», в которой есть поле для каждого атрибута рыб (тип, скорость, цвет и т. Д.). Таким образом, пользователь заполняет поля соответствующими значениями, и когда он нажимает «добавить», вызывается конструктор. По крайней мере, так я это себе представляю. :)

Ответы [ 4 ]

1 голос
/ 28 января 2010

Java - это ОО-язык, и он работает с классами и объектами. Заманчивое, наивное решение состояло бы в том, чтобы ваша программа работала с «классами» fish, как будто она работает с классами чего-либо, то есть для создания некоторого кода Java и предоставления компилятору и загрузчику возможности вводить его в среду выполнения.

Этот подход можно заставить работать, с некоторой неловкостью. По сути, ваше кодирование «динамических классов Java», вероятно, в конечном итоге окажется намного больше и сложнее, чем фактически предполагает ваше назначение.

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

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

Если вам действительно нужны новые и динамические атрибуты, то вы могли бы пройти долгий путь, используя, например, HashMap для хранения пар имя / значение. Вы можете позволить пользователю добавить "legs" / "4", а затем распечатать этот новый атрибут как есть; но вы не могли заставить рыбу ходить по этим ногам, потому что вам не хватало бы кода для работы с новым атрибутом.

1 голос
/ 28 января 2010

Я бы просто использовал карту:

class Fish
{
  Map<String,String> attributes = new HashMap<String,String>();
  setBusterFish()
  {
    attributes.put("speed", "5");
    attributes.put("colour", "red");
    attributes.put("hunger", "10");
    attributes.put("name", "buster");
  }
}
0 голосов
/ 28 января 2010

Посмотрите на шаблон объекта типа . Кроме того, Google для этого я только что дал одну из первых ссылок, которые я нашел ...

Вы также можете посмотреть шаблон отражения ...

0 голосов
/ 28 января 2010

Позвольте пользователю определить значения атрибутов экземпляра, скажем, класса FishSpecies, и дать FishSpecies метод createFish, который создает рыбу этого вида (т.е. имеющую эти значения атрибута). Отслеживание всех объектов FishSpecies в списке дает вам возможность управлять объектами FishSpecies и создавать объекты Fish данного вида.

Если я правильно понимаю ваш вопрос, то я считаю, что усложнять вещи больше, чем это, - ошибка.

...