Ruby Abstract Class Design - PullRequest
       10

Ruby Abstract Class Design

2 голосов
/ 07 апреля 2010

Я создаю видеоигру. У него есть Персонажи и Предметы. Так как я хочу, чтобы символы и элементы имели каждое имя, должен ли я создать другой класс с именем NamedObjects, используя только поле имени, и чтобы символы и элементы расширяли его? Или это за борт?

Ответы [ 5 ]

3 голосов
/ 07 апреля 2010

Для чего-то столь же простого, как атрибут имени, возможно, не стоит писать модульный код, потому что единственная строка, которая может вам понадобиться:

attr_accessor :name

Конечно, если вы предвидите, что именованные объекты в будущем будут иметь больше функциональных возможностей, ваша проблема вполне оправдана. Вместо использования наследования лучше использовать модули в Ruby:

module Nameable
  attr_accessor :name

  # To be expanded.
end

class Item
  include Nameable
end

class Character
  include Nameable
end
2 голосов
/ 07 апреля 2010

Классы, как правило, должны совместно использовать базовый класс, когда они имеют одинаковое поведение, а не одинаковые данные. ООП всегда должен быть о поведении. Вам также следует подумать о / изучить принцип подстановки Лискова при создании базовых классов.

2 голосов
/ 07 апреля 2010

Если все, что они разделяют, это имя, это, вероятно, излишне.

1 голос
/ 07 апреля 2010

В Java я бы создал интерфейс NamedObject, как вы сказали. Тем не менее, Ruby является динамическим языком с утиной типизацией. Там нет интерфейсов. Так что просто определите атрибут имени и используйте его там, где вам нужно.

0 голосов
/ 07 апреля 2010

Вам когда-нибудь понадобится перебрать кучу NamedObjects и отобразить имя? Если это так, вам нужен класс NamedObjects. Если вы этого не сделаете, вы не ...

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

...