我一直在关注从以下链接在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'
现在我没有把它放在哪里,在实例端或在类中,我决定将它放在实例端以下:
以及我拥有的最后一个方法如下,我把它们放在课堂上:
我已使用以下代码测试了Transcript中的类:
aDog := Dog new.
Dog count.
bDog := Dog new.
Dog count.
它有效,但我想知道我是否做出了正确的决定将这些方法放在课堂上(第二个问题),如果它的权利可以让任何人给我一个例子在这个例子中放入实例端的方法?
由于
答案 0 :(得分:6)
第一个问题
课程前面的感叹号!
是一个点击它的邀请。在这种情况下,它会提醒您类应该有注释(为了文档)。
<强>题外话强>
每个类都定义其实例的形状(或结构)和行为。形状由类创建消息中的实例变量给出,例如
Object subclass: #Dog
instanceVariableNames: 'name breed birthdate'
classVariableNames: ''
package: 'TestC'
对于您在类
的实例端创建方法的行为breed: aString
breed := aString
有了这个,你就拥有了一个完整的功能对象
dog := Dog new.
dog name: 'Taylor'; breed: 'Great Dane'
但是,类也是对象。所以,他们可能有自己的形状。要将实例变量添加到类的形状,请发送消息:
Dog class instaceVariableNames: 'count'
请注意,此消息的接收者是Dog
类(a Metaclass
)的类,这是有道理的,因为它是对其实例进行整形的类。
在您的示例中,每次创建Dog
的新count
时,Dog
类的Dog
ivar将增加1.这可以提供跟踪的建议到目前为止已创建了多少count
个实例。但是,这些情况仍然没有意识到这一事实。
第二个问题
是的,ivar initialize
以及increment
,retrieve
和var playerScores = [{ player: 'Dealer', score: 19, cards: 'A of ♥, 5 of ♦' }, { player: 'Player1', score: 18, cards: '10 of ♦, 8 of ♦' }, { player: 'Player2', score: 23, cards: '6 of ♦, 6 of ♥, J of ♠' }],
value = 20,
result = playerScores.reduce(function (r, o) {
if (o.score >= value) {
return r;
}
if (!r.length || r[0].score < o.score) {
return [o];
}
if (r[0].score === o.score) {
r.push(o);
}
return r;
}, []);
console.log(result);
的方法属于班级。为什么?因为它们旨在跟踪您的类创建的实例数。这是否有用,是一个不同的问题;事实上,他们在实例方面没有任何意义(毕竟,幸运的狗生活在令人兴奋的生活中而没有任何数字。)