2010-04-07 8 views
2

Я создаю видеоигру. Он имеет персонажей & Предметы. Так как мне нужны символы & Элементы для каждого имеют имя, должен ли я создать другой класс под названием NamedObjects с просто полем имени и иметь символы & Элементы расширяют это? Или это за борт?Ruby Abstract Class Design

ответ

3

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

attr_accessor :name 

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

module Nameable 
    attr_accessor :name 

    # To be expanded. 
end 

class Item 
    include Nameable 
end 

class Character 
    include Nameable 
end 
+0

Аминь к этому. Использование mixins также предотвратит довольно распространенный случай, когда у вас есть классы 'A',' B' и 'C': допустим,' A' и 'B' имеют общую функциональность' F'' и 'A' и' C' функциональность 'F'''. С наследованием класса вы в значительной степени застряли там. –

+0

@Mladen Jablanović: Наследование Эйфеля прекрасно справится с этой ситуацией, хотя я согласен с тем, что миксины часто являются лучшим решением. – Arkku

+0

+1. Возможно, вы можете расширить этот ответ с помощью нескольких методов в модуле. (Я не могу думать ни о каком банкомате ...) –

2

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

2

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

+0

Как понятие атрибута аксессоров (который, возможно, будет использоваться для реализации 'name' в данном случае) вписывается в это правило поведения/данных? Кстати, вы можете прояснить связь принципа Лискова с вопросом здесь, я не вижу? –

0

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

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

1

В java я бы создал интерфейс NamedObject, как вы сказали. Однако Ruby - это динамический язык с языком. Нет интерфейсов. Поэтому просто определите атрибут имени и используйте его там, где он вам нужен.