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 和 userName
,userEmail
和 userPhone
是参数。您可以像在您的示例中那样调用此方法。 name
和 email
是实例端变量的 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),但应该仍然有用。
我正在在线学习 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 和 userName
,userEmail
和 userPhone
是参数。您可以像在您的示例中那样调用此方法。 name
和 email
是实例端变量的 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),但应该仍然有用。