Тег operator-overloading
определен в переполнении стека как
функция языка программирования, которая позволяет настраивать реализации для операторов в зависимости от типов используемых операндов.Некоторые языки позволяют определять новые операторы, в то время как другие допускают только переопределение существующих.
В Smalltalk
Все типы определены как классы объекта *
Все операторы являются методами *
Все методы выполняются получателем сообщения с именем метода
Все методы могут быть переопределены
Таким образом, любой оператор, работающий с любым операндом, может быть переопределен любым разработчиком.
Вот несколько примеров:
Объекты класса Float
, класса SmallInt
, класса Fraction
и класса Point
могут ответить на сообщение +
.Они также могут взаимодействовать друг с другом.
aFloat := 3.1415 .
aSmallInt := '6' .
aPoint := 3@3 .
aFraction := 22/7 .
"отправить сообщение + aSmallInt
на aFraction
"
aSum := aFraction + aSmallInt
Оценивает: 64/7
"отправьте сообщение + aFraction
aSmallInt
"
aSum := aSmallInt + aFraction
Оценивает: 64/7
aSum := aFloat + aFraction
aSum := aFraction + aFloat
Они оценивают: 6.284357142857143
aSum := aFloat + aSmallInt
aSum := aSmallInt + aFloat
Они оценивают: 9.1415
aSum := aPoint + aSmallInt
aSum := aSmallInt + aPoint
Они оценивают: 9@9
В действительности, у нас есть 8 различных реализаций оператора +
на дисплее, каждая из которых настроена наиметь дело с типами задействованных операндов.
Предостережения: * Объекты не являются строго типизированными.Любая переменная одного типа может быть изменена на любой другой тип, и система не вызовет исключение.Объект может начинаться как объект класса SmallInt, а затем может быть изменен на ByteString или Dictionary, и система не выдаст ни малейшего предупреждения.Пока не отправлено сообщение, которое он не понимает.
Существует 6 примитивов, которые не являются объектом или классом объекта: true, false, nil и т. Д.
Есть два операторакоторые, по сути, являются синтаксическим сахаром для именованных методов.