pharo中的一对多关系

时间:2015-10-30 16:36:48

标签: pharo

我们如何在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'

2 个答案:

答案 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)。