2015-10-30 3 views
0

Как мы можем реализовать ассоциации между классами в pharo. Я попробовал этот код, чтобы создать новый класс. но это не работает ...Относительно многих отношений в pharo

Object subclass: #SlotExampleMovie 
    slots: { 
     #name. 
     #year. 
     #director => ToOneRelationSlot opposite: #directedMovies class: #SlotExamplePerson. 
     #actors => ToManyRelationSlot opposite: #actedInMovies class: #SlotExamplePerson. } 
    classVariables: { } 
    category: 'SlotAssociations-Tests-Example' 

ответ

0

Я не знаю, где вы получили селектор opposite:class: от ... Селектор вы ищете именем inverse:inClass:. Ваш код будет выглядеть так:

Object subclass: #SlotExampleMovie 
    slots: { 
    #name. 
    #year. 
    #director => ToOneRelationSlot inverse: #directedMovies inClass: #SlotExamplePerson. 
    #actors => ToManyRelationSlot inverse: #actedInMovies inClass: #SlotExamplePerson. } 
    classVariables: { } 
    category: 'SlotAssociations-Tests-Example' 
0

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

Предположим, вы хотите смоделировать связь между книгой (экземпляр класса Book) и ее авторами (экземплярами класса Person).

Затем вы объявляете «переменную экземпляра», называемую авторами в классной книге. Эта переменная будет держать коллекцию (экземпляр некоторого класса коллекции), что в свою очередь будет держать авторов (экземпляры класса Person)

Object subclass: #Book 
    instanceVariableNames: 'authors' 
    classVariableNames: '' 
    category: 'examples' 

Затем нужно создать (в первую очередь) коллекции. Вы делаете это в методе initialize вашего класса Book (это первое сообщение, которое получает объект, когда он создается).

Я использовал набор, но есть другие объекты коллекции.

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

>> addAuthor: someObject 
    authors add: someObject 

Затем, вы можете просто использовать его, как это:

a := Book new. 
p := Person new. 
a addAuthor: p. 

Поскольку Pharo динамически типизируется (вам не нужно явно вводить переменные), параметр author: может быть любым объектом. С документацией и хорошими именами переменных вы можете сказать, что это должен быть Лич (на самом деле параметр должен быть лучше назван aPerson).

Резюме: В книге есть коллекция в переменной экземпляра «авторы». Когда вы сообщаете книге, чтобы добавить нового автора (с сообщением addAuthor:), он сообщает коллекции о сохранении объекта (с сообщением add:).

Смежные вопросы