我们如何在pharo中实现类之间的关联。我尝试了这段代码来创建一个新的classe。但是,它不起作用......
Object subclass: #SlotExampleMovie
slots: {
#name.
#year.
#director => ToOneRelationSlot opposite: #directedMovies class: #SlotExamplePerson.
#actors => ToManyRelationSlot opposite: #actedInMovies class: #SlotExamplePerson. }
classVariables: { }
category: 'SlotAssociations-Tests-Example'
答案 0 :(得分: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'
答案 1 :(得分:0)
我相信你不需要插槽。您可以只使用实例变量。
假设您要对书(Book类的实例)与其作者(Person类的实例)之间的关系进行建模。
然后,在类Book中声明一个名为authors的“实例变量”。该变量将保存一个集合(某个集合类的实例),而这些集合又将保存作者(类Person的实例)
Object subclass: #Book
instanceVariableNames: 'authors'
classVariableNames: ''
category: 'examples'
然后,您需要创建(首先)该集合。您可以在Book类的initialize方法中执行此操作(这是对象在创建时接收的第一条消息)。
>> initialize
authors := Set new.
我使用了一个集合,但还有其他集合对象。
然后你需要一个方法来告诉一本书有一个新作者:
>> addAuthor: someObject
authors add: someObject
然后,您可以像以下一样使用它:
a := Book new.
p := Person new.
a addAuthor: p.
因为Pharo是动态类型的(你不需要显式地键入变量),所以author:的参数可以是任何对象。使用文档和良好的变量名称,您可以告诉它应该是Person(事实上,该参数应该更好地称为aPerson)。
摘要:本书的实例变量“authors”中有一个集合。当您告诉本书添加新作者(使用addAuthor:message)时,它会告诉集合保存该对象(使用add:message)。