Базовый подкласс Smalltalk - PullRequest
       14

Базовый подкласс Smalltalk

1 голос
/ 28 февраля 2012

Я пытаюсь создать чрезвычайно простой класс Vector как подкласс Array в Smalltalk. Мой код для создания класса выглядит так:

Array subclass: #Vector
Vector comment: 'I represent a Vector of integers'

Vector class extend [
new [
    | r |
    <category: 'instance creation'>
    r := super new.
    r init.
    ^r 
    ]
 ]

Vector extend [
init [
    <category: 'initialization'>
    ]
 ]

Очевидно, я еще не написал никаких методов, но я просто пытаюсь заставить эту часть работать в первую очередь. После того, как класс создан, как указано выше, если я наберу: v: = новый вектор: 4 Я получаю ошибку:

Object: Vector error: should not be implemented in this class, use #new instead
SystemExceptions.WrongMessageSent(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.WrongMessageSent class>>signalOn:useInstead: (SysExcept.st:1219)
Vector class(Behavior)>>new: (Builtins.st:70)
UndefinedObject>>executeStatements (a String:1)
nil

Я предполагал, что, поскольку это подкласс Array, я мог бы создать вектор таким образом. Каков наилучший способ сделать это? Спасибо!

Редактировать - я понял это. После более глубокого изучения учебника я обнаружил, что мне нужно включить

1 Ответ

4 голосов
/ 28 февраля 2012

Массив - это особый вид класса, который имеет индексируемые экземпляры разной длины.

В GNU Smalltalk (который вы, похоже, используете) класс Array объявлен как:

ArrayedCollection subclass: Array [       
    <shape: #pointer>

Для наследования этого поведения вы можете использовать:

Array subclass: Vector [<shape: #inherit>]

Но в большинстве случаев имеет смысл создать класс, который инкапсулирует Array, а не класс, наследующий Array.

Стоит также отметить, что OrderedCollection является эквивалентом Smalltalk контейнера vector из C ++ и Java.

...