在Pharo Smalltalk中创建一个类?

Lit*_*tle 4 smalltalk pharo

我一直在关注从Pharo在以下链接中创建课程的示例:https: //ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/PharoObjectModel/PharoObjectModel.html#fig :colorInstanceClassSide

这是制作狗和鬣狗课程的例子.首先,我创建了一个名为TestC的包,在Instance类中我创建了以下内容:

在此输入图像描述

在此输入图像描述

对于我所知道的,如果我错了,请纠正我,实例方面是我创建在实例化对象时将起作用的方法,而类侧则不需要创建对象来实现; 就像Java中的静态方法类一样.

我在这一点上的第一个问题就是为什么在接受改变后它仍然出现了!我班级左侧的符号?

根据教程,我应该把以下代码:

Dog class
    instanceVariableNames: 'count'
Run Code Online (Sandbox Code Playgroud)

现在我没有把它放在哪里,在实例端或类侧,我决定将它放在实例端以下:

在此输入图像描述

我最后的方法如下,我把它们放在课堂上:

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

我使用以下代码测试了Transcript中的类:

aDog := Dog new.
Dog count.
bDog := Dog new.
Dog count.
Run Code Online (Sandbox Code Playgroud)

并且它有效,但我想知道我是否做出了正确的决定将这些方法放在课堂上(第二个问题),如果它的权利可以任何人给我一个方法的例子来放入实例方面例?

谢谢

Lea*_*lia 6

第一个问题

!课程前面的感叹号是一个点击它的邀请.在这种情况下,它会提醒您类应该有注释(为了文档).

插话

每个类都定义其实例的形状(或结构)和行为.形状由类创建消息中的实例变量给出,例如

Object subclass: #Dog
  instanceVariableNames: 'name breed birthdate'
  classVariableNames: ''
  package: 'TestC'
Run Code Online (Sandbox Code Playgroud)

对于您在类的实例端创建方法的行为

breed: aString
  breed := aString
Run Code Online (Sandbox Code Playgroud)

有了这个你就有了一个完整的功能对象

dog := Dog new.
dog name: 'Taylor'; breed: 'Great Dane'
Run Code Online (Sandbox Code Playgroud)

但是,类也是对象.所以,他们可能有自己的形状.要将实例变量添加到类的形状,请发送消息:

Dog class instaceVariableNames: 'count'
Run Code Online (Sandbox Code Playgroud)

请注意,此消息的接收者是Dog类(a Metaclass)的类,这是有意义的,因为它是形成其实例的类.

在您的示例中,每次创建新的(实例)时,类Dogcountivar Dog将增加1.这可以提供跟踪Dog到目前为止已创建了多少实例的建议.但是,这些情况仍然没有意识到这一事实.

第二个问题

是的,伊娃count和方法initialize,increment并且retrieve它属于类中的一面.为什么?因为它们旨在跟踪您的类创建的实例数.这是否有用,是一个不同的问题; 事实上,他们在实例方面没有任何意义(毕竟,幸运的狗生活在令人兴奋的生活中而没有任何数字.)