Pharo 4.0

时间:2015-06-14 06:52:25

标签: smalltalk pharo

我在线学习Pharo并且不确定我是否正确创建类和实例变量的语法。如果我错了,请纠正我: -

在Pharo的类侧创建的类(静态)方法,其中name,email,phone是CreateUser类的实例变量:

createNewUser:Arguments name:userName email:userEmail phone:userPhone

要调用CreateUser类的静态方法,我将执行以下操作: -

CreateUser 
     name:userName
     email:userEmail
     phone:userPhone

如果我想用这个名称创建一个实例变量,那么方法声明将与上面完全相同,但它将在类的实例端。但是,当我调用该方法时,我将使用关键字“new”来调用它来创建一个新实例,如下所示:

CreateUser new
     name:userName
     email:userEmail
     phone:userPhone

当我运行上面的代码并静态调用此方法时,我收到一条错误消息: -

MessageNotUnderstood: CreateUser class >>name:email:phone:

但是,当我去CreateUser类重新检查时,我看到上面的方法在类侧创建为:

CreateUser:name:email:phone:

我的查询如下: 1.上面我做错了什么?我该如何解决上述错误? 2.使用静态变量/方法与类变量/方法背后的概念 和Java一样吗? 3.如果我想访问上面的实例变量,我可以为类/实例添加访问器方法,然后使用类实例/类对象实例调用它们。这是对的吗?

您将给予的任何帮助将不胜感激!非常感谢提前。

2 个答案:

答案 0 :(得分:9)

我猜你有点误解了方法语法,因为createNewUser:Arguments部分没有意义。你应该拥有的是类方面的方法:

name: userName email: userEmail phone: userPhone
   "and here you probably have something like:"
   name := userName.
   email := userEmail.
   "and so on"

在我的示例中name:email:phone:是方法的选择器,userNameuserEmailuserPhone是参数。您可以像在示例中一样调用此方法。 nameemail是实例端变量的类侧,具体取决于方法的定义位置。

此外,您不应该为课程CreateUser命名。想一想,这些实例会被称为什么? "调用createUsers&#34 ;?通常您将类命名为User,然后您可以将实例视为" users",然后类对象的责任是"来创建用户(其实例) "

请注意,在课堂上使用这样的方法很奇怪。你通常做的是创建一个实例方法:

initializeName: userName email: userEmail phone: userPhone
   name := userName.
   email := userEmail.
   phone := userPhone

和课堂方法:

newName: userName email: userEmail phone: userPhone
   | instance |
   instance := self new.
   instance initializeName: userName email: userEmail phone: userPhone.
   ^ instance

或使用级联消息的较短版本:

newName: userName email: userEmail phone: userPhone
   ^ self new
      initializeName: userName email: userEmail phone: userPhone;
      yourself

2)在Pharo(和Smalltalk)中,这个概念有点简单。由于一切都是一个对象,Class也是一个对象,所以类的副变量和方法是一个类的实例变量和方法,它是"类类"的一个实例。下一张图片可以帮助您理解Pharo中对象之间的关联:

enter image description here

这可能在开始时有点混乱,但最后,你没有静态/非静态方法/变量,你只需要对象,实例化和继承。

所以你应该考虑的是你要问的对象是什么。您可能会向用户询问有关它的电子邮件或手机号码,但您会要求用户类创建用户或查找用户,或者为用户建议默认的T恤尺寸。

3)是的,您应该创建一个访问者。此外,如果您在系统浏览器中选择一个类并根据您的操作系统按Cmd + H + A(或Ctrl或Alt),您将获得一个用于创建自动存取器的对话框

答案 1 :(得分:0)

@Rekha - In case you find this useful in your learning, take a look at the Updated Pharo By Example book. (Specifically, the 'Pharo Object Model' chapter, which is exactly about the topic of this question -- instance creation, class variables, inheritance, etc). The book is a work in progress (we're updating the old 'Pharo by Example' book to refer to the new version of Pharo), but should still prove useful.