Smalltalk Pharo4.0中类和实例变量及方法的语法

Smalltalk Pharo4.0中类和实例变量及方法的语法,smalltalk,pharo,Smalltalk,Pharo,我正在网上学习Pharo,不确定我是否掌握了创建类和实例变量的正确语法。如果我错了,请纠正我:- 在Pharo的类端创建的类(静态)方法,其中名称、电子邮件、电话是类CreateUser的实例变量: createNewUser:Arguments name:userName email:userEmail phone:userPhone 要调用CreateUser类的此静态方法,我将执行以下操作:- CreateUser name:userName email:userE

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

在Pharo的类端创建的类(静态)方法,其中名称、电子邮件、电话是类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类进行重新检查时,我在类侧看到上面的方法create,如下所示:

CreateUser:name:email:phone:
我的问题如下: 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"
在我的示例中,
name:email:phone:
是方法的选择器,
userName
userEmail
userPhone
是参数。您可以像示例中那样调用此方法
name
email
是类端对实例端变量,具体取决于方法的定义位置

此外,您不应该命名类
CreateUser
。想想看,这些实例将被称为什么?“createUsers”?通常您命名一个类用户,然后您可以将实例视为“用户”,然后类对象的责任是“创建用户(其实例)”

请注意,在类端有这样的方法是很奇怪的。您通常要做的是创建一个实例方法:

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)中,这个概念稍微简单一些。因为一切都是一个对象,类也是一个对象,所以类边变量和方法是作为“类类”实例的类的实例变量和方法。下一张图片可能有助于您了解Pharo中对象之间的关联:

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

所以你应该考虑的是,你要问这些物体关于什么。也许您应该询问用户其电子邮件或手机号码,但您将要求用户类创建用户或查找用户,或者为用户建议默认的t恤尺寸


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

@Rekha-如果您觉得这对您的学习有用,请阅读本书。(特别是“Pharo对象模型”一章,它正是关于这个问题的主题——实例创建、类变量、继承等)。这本书正在进行中(我们正在更新旧的“Pharo by Example”一书,以参考新版本的Pharo),但应该仍然很有用。

这一点现在已经非常清楚了。非常感谢你。我的代码现在可以工作了,我还按照你的建议修改了类名。然而,关于物体的讨论让我思考。。如果每件事都是一个对象,那么类侧方法和变量也被视为“类类”的对象,那么我们可以使用smalltalk实现多态性和继承吗?我的意思是,我知道也没有办法为变量/参数/返回值定义数据类型。如果是这样,编译时多态性是否存在?继承是单一的还是多重的?最后,什么是双重分派?@Rekha Pharo是完全面向对象的语言,具有单一继承和特性。“一切都是一个对象”的概念允许您在需要处理某些东西时拥有相同的“接口”。例如,如果执行名为#printOn:的
对象方法,您将获得CompiledMethod类的一个实例,它是您的类。要使用它,你不需要一些特殊的工具,但因为它是一个对象,你可以向它发送一条消息
(objectmethodnamed:#printOn:)argumentNames
将返回所有参数名称。你也可以评估这个方法,问它是AST等等。我明白了。那么抽象类/接口指的是同一件事?我知道您可以使用“子类责任”的方法定义抽象类,从而强制创建自己的实现。这是实现抽象类/接口/继承的唯一方法吗?@Rekha,你看,Pharo不会强迫你做所有复杂类型的事情(这很好)。现在要实现多态性,不需要对同一事物进行子类化。例如,
Stream
s和
Transcript
s都实现了使它们多态的
#nextPutAll:
方法:您可以用流替换成绩单,并且日志记录不会中断。现在,为了帮助传达意图,我们有了类似
#subassresponsibility
的方法,为了避免代码重复,您可以使用继承或特征,它们是“可插入的行为集”,即它们只包含方法而不包含数据