我在线学习Pharo并且不确定我是否正确创建类和实例变量的语法.如果我错了,请纠正我: -
在Pharo的类侧创建的类(静态)方法,其中name,email,phone是CreateUser类的实例变量:
createNewUser:Arguments name:userName email:userEmail phone:userPhone
Run Code Online (Sandbox Code Playgroud)
要调用CreateUser类的静态方法,我将执行以下操作: -
CreateUser
name:userName
email:userEmail
phone:userPhone
Run Code Online (Sandbox Code Playgroud)
如果我想通过此名称创建实例变量,则方法声明将与上面完全相同,但它将位于类的实例端.但是,当我调用该方法时,我将使用关键字"new"来调用它来创建一个新实例,如下所示:
CreateUser new
name:userName
email:userEmail
phone:userPhone
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码并静态调用此方法时,我收到一条错误消息: -
MessageNotUnderstood: CreateUser class >>name:email:phone:
Run Code Online (Sandbox Code Playgroud)
但是,当我去CreateUser类重新检查时,我看到上面的方法在类侧创建为:
CreateUser:name:email:phone:
Run Code Online (Sandbox Code Playgroud)
我的疑问如下:1.我上面做错了什么?我该如何解决上述错误?2.使用静态变量/方法与类变量/方法背后的概念与Java相同?3.如果我想访问上面的实例变量,我可以为类/实例添加访问器方法,然后使用类实例/类对象实例调用它们.那是对的吗?
您将给予的任何帮助将不胜感激!首先十分感谢.
我猜你有点误解了方法语法,因为createNewUser:Arguments部分没有意义.你应该拥有的是类方面的方法,如下所示:
name: userName email: userEmail phone: userPhone
"and here you probably have something like:"
name := userName.
email := userEmail.
"and so on"
Run Code Online (Sandbox Code Playgroud)
在我的例子中name:email:phone:是方法的选择器和userName,userEmail并且userPhone是参数.您可以像在示例中一样调用此方法.name并且email是实例端变量的类侧,具体取决于定义方法的位置.
你也不应该说一个班级CreateUser.想一想,这些实例会被称为什么?"调用createUsers"?通常您将类命名为User,然后您可以将实例视为"users",然后类对象的责任是"创建用户(其实例)".
请注意,在课堂上有这样的方法很奇怪.你通常做的是创建一个实例方法:
initializeName: userName email: userEmail phone: userPhone
name := userName.
email := userEmail.
phone := userPhone
Run Code Online (Sandbox Code Playgroud)
和班级方法:
newName: userName email: userEmail phone: userPhone
| instance |
instance := self new.
instance initializeName: userName email: userEmail phone: userPhone.
^ instance
Run Code Online (Sandbox Code Playgroud)
或使用级联消息的较短版本:
newName: userName email: userEmail phone: userPhone
^ self new
initializeName: userName email: userEmail phone: userPhone;
yourself
Run Code Online (Sandbox Code Playgroud)
2)在Pharo(和Smalltalk)中,这个概念有点简单.由于一切都是对象,Class也是一个对象,因此类侧变量和方法是类的实例变量和方法,它是"类类"的一个实例.下一张图片可以帮助您理解Pharo中对象之间的关联:

这可能在开始时有点令人困惑,但最后,你没有静态/非静态方法/变量,你只需要对象,实例化和继承.
所以你应该考虑的是你要问的对象是什么.您可能会向用户询问有关电子邮件或手机号码的信息,但您会要求用户类创建用户或查找用户,或者为用户建议默认的T恤尺寸.
3)是的,你应该做一个访问者.此外,如果您在系统浏览器中选择一个类并根据您的操作系统按Cmd + H + A(或Ctrl或Alt),您将获得一个用于创建自动访问者的对话框