Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[2]

Иерархия классов используется еще и тогда, когда надо определить тот метод, который должен выполнить объект в ответ на полученное им сообщение. Когда объекту посылается сообщение, метод с подходящим именем ищется в классе, которому принадлежит получатель сообщения. Если метод там не найден, поиск продолжается в суперклассе и так далее по цепочке суперклассов снизу вверх, до класса Object, пока нужный метод не будет найден. Если нужный метод не найден ни в одном классе, получателю посылается сообщение с именем doesNotUnderstand: и аргументом, содержащим нереализованное сообщение. В классе Object есть специальный метод с таким именем, который информирует программиста о возникшей ошибочной ситуации.

Классы и Метаклассы

Поскольку все компоненты системы Smalltalk-80 представляются объектами, а все объекты являются экземплярами классов, сами классы тоже должны представляться экземплярами некоторых классов. Класс, экземпляры которого сами являются классами называется метаклассом. Таким образом, каждый класс является единственным экземпляром своего собственного метакласса и, всякий раз, когда создается новый класс, для него автоматически создается новый метакласс. Как и другие классы, метакласс наследует информацию от суперкласса. Иерархия метаклассов образуется параллельно иерархии классов. Метаклассы похожи на другие классы, поскольку они содержат методы, используемые своими экземплярами.

Но метаклассы отличаются от других классов тем, что они не являются экземплярами своих метаклассов. Вместо этого, они все являются экземплярами класса с именем Metaclass (Метакласс). Кроме того, у метаклассов нет имен. Метакласс становится доступным, когда его экземпляру посылается сообщения class. Например, на метакласс класса Rectangle (Прямоугольник) можно сослаться выражением Rectangle class.

Когда метаклассы были добавлены в систему Smalltalk, был сделан следующий и последний шаг в организации классов. В системе определили абстрактный класс с именем ClassDescription (ОписаниеКласса) для описания классов и их экземпляров. Классы Class и Metaclass сделали подклассами класса OassDescription. Как мы знаем, цепочка суперклассов любого класса заканчивается на классе Object, а сам класс Object не имеет суперкласса. А метакласс класса Object имеет своим суперклассом класс Class!

Сообщения метаклассам обычно посылаются для создания и инициализации экземпляров, а также для инициализации переменных класса.

Smalltalk: Синтаксис языка

"Чему же Вас учили?" - спросила Алиса. "Сначала чихать и плясать, а затем четырем действиям арифметики: Служению, Почитанию, Угождению и Давлению." - ответил Мак-Тартль.

Льюис Кэррол

Синтаксис объясняет, какие последовательности символов составляют правильные выражения. В языке программирования Smalltalk-80 существуют четыре типа выражений.


1.Литералы описывают некоторые постоянные объекты, такие как числа или строки символов.

2.Имена переменных описывают доступные переменные. Значение имени переменной - текущее значение переменной с этим именем.

3.Выражения посылки сообщения описывают сообщения, посланные получателю. Значение такого выражения определяется тем методом, которое вызывается сообщением. Поиск метода начинается с класса получателя.

4.Выражения-блоки описывают объекты, представляющие отложенные действия. Блоки применяются для реализации управляющих структур.

Выражения находятся в двух местах: в методах и в тексте, изображенном на экране. Когда посылается сообщение, из класса получателя выбирается метод и его выражения выполняются. Интерфейс пользователя позволяет выбирать и выполнять выражения на экране. Подробности этого процесса выходят за пределы нашего обзора.

Из четырех типов перечисленных выше выражений только имена переменных зависят от контекста. Местонахождение выражения в системе определяет, какие последовательности символов будут правильными именами переменных. Множество имен переменных, допустимых в выражениях методов, зависят от класса, в котором находится метод. В остальном синтаксис выражения не зависит от местоположения последнего.

Литералы

На пять видов объектов можно ссылаться с помощью литеральных выражений. Так как значение литерального выражения всегда один и тот же объект, такое выражение называют литеральной константой: числа, отдельные символы, строки символов, имена, массивы других литеральных констант.

Числа - объекты системы, которые представляют числовые значения и отвечают на сообщения, вычисляющие математические результаты. Литеральное представление десятичного числа стандартное. Например:

3 30.45 -3 -14.0 13772

Числовые константы могут выражаться и не в десятичной системе счисления с помощью предшествующего цифрам префикса основания системы счисления. Префикс состоит из цифровой величины основания (всегда выраженной в десятичной системе) и следующей за ней буквы "r". Следующие примеры представляют числа в восьмеричной системе и шестнадцатеричной системе (в скобках даны их десятичная форма):

8r377 (255) 8r34.1 (28.125) 8r-37 (-31) 16rFF (255) 16rAC.DC (172.859)

Числовые константы также могут выражаться в экспоненциальной форме с помощью экспоненциального суффикса. Экспоненциальный суффикс состоит из (латинской) буквы "е" и следующего за ним порядка, выраженного в десятичной системе счисления. Число, определенное перед экспоненциальным суффиксом, умножается на основание системы счисления, возведенное в степень, заданную порядком.

1.586e5 (158600.0) 1.586e-3 (0.001586) 8r3e2 (192)


Символы

Символы - объекты, которые представляют собой отдельные элементы алфавита. Символьное литеральное выражение состоит из символа доллара ("$") и следующего за ним произвольного символа алфавита. Например:

$t $Ф $- $$ $1

Строки

Строки - это объекты, которые представляют собой последовательности символов. Литеральное представление строки - последовательность символов, заключенная в апострофы:

привет food Система Smalltalk-80

Любой символ может быть включен в строку. Если апостроф сам входит в строку, то он должен дублироваться, чтобы избежать путаницы с ограничителем. Например, строковая литеральная константа

cant

представляет строку из пяти символов $c, $a, $n, $, $t.

Имена

Имена - объекты, которые представляют собой строки для именования элементов системы. Литеральное представление имени - последовательность символов, начинающаяся символом "#", например:

#bill #М63

Есть некоторые ограничения на символы, которые могут быть в именах. Не существует разных имен с одинаковым набором символов; в системе каждое имя уникально.

Массивы

Массив - простая структура данных, на элементы которой можно ссылаться целыми индексами от 1 до числа, равного размеру массива. Литеральное представление массива - символ "#", за которым следует заключенная в круглые скобки последовательность других литералов - чисел, символов, строк, имен и массивов. Элементы массива отделяются пробелами. Перед вложенными в массив именами и массивами не ставится символ "#". Например, массив из семи строк описывается выражением

#(food utilities rent household trasnport taxes recreation)

Массив из двух массивов и двух чисел описывается выражением

#((one 1) (not negative) 0 -1)



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5]