2012-02-27 4 views
1

Я пытаюсь создать чрезвычайно простой векторный класс в качестве подкласса Array в Smalltalk. Мой код для создания класса выглядит следующим образом:Basic Smalltalk Subclass

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, я мог бы создать вектор в этот способ. Каков наилучший способ сделать это? Благодаря!

Редактировать - я понял. Прочитав глубже в учебнике, я обнаружил, что мне нужно включить < shape: #pointer >

+0

Я думаю, что у вас такая же проблема, как и у этого парня: http://stackoverflow.com/questions/5613363/gnu-smalltalk-problem-with-example-in-tutorial-object-creation – andrewdotnich

+0

Я посмотрел этот пост и изменил эти вещи, но у меня все те же результаты. – FlapsFail

ответ

4

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

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

ArrayedCollection subclass: Array [  
    <shape: #pointer> 

Чтобы наследовать это поведение, которое вы можете использовать:

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

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

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