class 的语法以及 Pharo 4.0 中的实例变量和方法

Syntax for class and instance variables and methods in Pharo 4.0

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

Class(静态)方法在 Pharo 的 class 端创建,其中名称、电子邮件、phone 是 class CreateUser:[=16= 的实例变量]

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

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

CreateUser 
     name:userName
     email:userEmail
     phone:userPhone

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

CreateUser new
     name:userName
     email:userEmail
     phone:userPhone

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

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

但是,当我转到 CreateUser class 重新检查时,我看到上面的方法在 class 端创建为:

CreateUser:name:email:phone:

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

如果您能提供任何帮助,我们将不胜感激!非常感谢。

我猜你对方法语法有点误解,因为 createNewUser:Arguments 部分没有意义。你应该拥有的是 class 方面的方法,如下所示:

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

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

另外你不应该命名 class CreateUser。想一想,这些实例会被称为什么? "createUsers"?通常你命名一个class用户,那么你可以认为实例是"users",那么class对象的责任是"to create users (its instances)".

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

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

和一个class辅助方法:

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 也是对象,因此 class 端变量和方法是 class 的实例变量和方法,class 是 "class class" 的实例。下一张图可以帮助你理解Pharo中对象之间的关联:

这可能一开始有点乱,但最后,你没有andstatic/nonstaticmethods/variables,你只有对象,实例化和继承。

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

3) 是的,你应该做一个访问器。此外,如果您在系统浏览器中 select a class 并根据您的 OS 按 Cmd+H+A(或 Ctrl 或 Alt),您将看到一个用于自动创建访问器的对话框

@Rekha - 如果您发现这对您的学习有用,请查看 Updated Pharo By Example 这本书。 (具体来说,'Pharo Object Model' 章节,正是关于这个问题的主题——实例创建、class 变量、继承等)。这本书正在制作中(我们正在更新旧的 'Pharo by Example' 书以引用新版本的 Pharo),但应该仍然有用。