0

为新手的问题道歉,但尽管经过长时间的尝试,我还是没有想到这一点。

我使用 Cincom Visualworks 中的 NewClass 功能创建了一个矩阵类。

Smalltalk.Core defineClass: #Matrix
    superclass: #{Core.Object}
    indexedType: #none
    private: false
    instanceVariableNames: 'rowCount columnCount cellValues '
    classInstanceVariableNames: ''
    imports: ''
    category: ''

添加了以下类方法:

withRowCount: rowCount withColumnCount: columnCount withCellValues: cellValues
    ^self new rowCount: rowCount columnCount: columnCount cellValues: cellValues.

添加了以下访问器方法:

cellValues
    ^cellValues
cellValues: anObject
    cellValues := anObject
columnCount
    ^columnCount
columnCount: anObject
    columnCount := anObject
rowCount
    ^rowCount
rowCount: anObject
    rowCount := anObject

我在工作区中有这段代码:

|myMatrix|
myMatrix := Matrix rowCount: 5 columnCount: 5 cellValues: 5.
Transcript show: (myMatrix rowCount).

但是编译器说该消息未定义。我想我的课堂方法没有按预期工作。有人可以指出我哪里出错了吗?

4

1 回答 1

1

第一: Matrix没有rowCount:columnCount:cellValues:方法。你可能的意思是Matrix withRowCount: 5 withColumnCount: 5 withCellValues: 5

其次,我认为方法返回最后一个表达式的值。所以链式方法并不像那样工作。(即使确实如此,它看起来仍然像一条消息。)

您的类方法可能应该像

withRowCount: rowCount withColumnCount: columnCount withCellValues: cellValues
    | newMatrix |
    newMatrix := self new.
    newMatrix rowCount: rowCount;
              columnCount: columnCount;
              cellValues: cellValues.
    ^newMatrix

;分解消息并告诉 Smalltalk 将所有三个发送到newMatrix.

然后你可以像这样使用它

|myMatrix|
myMatrix := Matrix withRowCount: 5 withColumnCount: 5 withCellValues: 5.
Transcript show: (myMatrix rowCount).
于 2013-09-22T18:43:43.583 回答