Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
 
For 2023 (and 2024 ...) - we are now fully retired from IT training.
We have made many, many friends over 25 years of teaching about Python, Tcl, Perl, PHP, Lua, Java, C and C++ - and MySQL, Linux and Solaris/SunOS too. Our training notes are now very much out of date, but due to upward compatability most of our examples remain operational and even relevant ad you are welcome to make us if them "as seen" and at your own risk.

Lisa and I (Graham) now live in what was our training centre in Melksham - happy to meet with former delegates here - but do check ahead before coming round. We are far from inactive - rather, enjoying the times that we are retired but still healthy enough in mind and body to be active!

I am also active in many other area and still look after a lot of web sites - you can find an index ((here))
Changing what operators do on objects - a comparison across different programming languages

In Object Oriented languages, you used named pieces of code known as methods to perform an operation on a variable - for example you might write
  weeklist.extend(weekend)
to take a list of (something) for a week and add a list relating to weekend onto the end of it.

Sometimes, the method you use might be considered to be an "addition" and in some languages you can actually (re)define operators such as "+" so that you can write things like
  week = weeklist + weekend
if you want to.

This facility is know as "operator overloading" and, given the right circumstances and a language that supports it, it can be very useful indeed. I'm going to take a look at each of the languages I teach, and where operator overloading is available I'll show you how to call it. I have also overloaded the conversion of objects into strings where I can, so that you can simple write something like
  print (object_var_name)
and you'll get a good representation of the object, not just a type / memory addrss / error message.

C and C++

In C++, you can overload the "+" operator by defining a function called opertor+ in you class. It doesn't work too well with pointers, because the C++ compile needs to be able to use + to do address (pointer) arithmetic.

Here's an example of how our test program ran:

  WomanWithCat:ruby grahamellis$ ./overload_add
  Service every 10 uses for Beans
  Service every 7 uses for Water
  Service every 4.11765 uses for Beans; Water
  WomanWithCat:ruby grahamellis$


And here's the calling code:

  int main () {
    Mtbs *beans = new Mtbs(10.0,"Beans");
    Mtbs *water = new Mtbs(7.0,"Water");
    Mtbs fill = *beans + *water;
    cout << *beans << endl;
    cout << *water << endl;
    cout << fill << endl;
  }


The complete example, including the definition of the class and the add method within it, may be found [here].

Perl

In Perl, the use overload pragma lets you reassign an operator (and indeed " to " is an operator) to a named function. Once you've done that you can write things like

  $beans = new mtbs(10,"Beans");
  $water = new mtbs(7,"Water");
  $fill = $beans + $water;
  print $beans;
  print $water;
  print $fill;


and get results like

  WomanWithCat:ruby grahamellis$ perl overload_add.pl
  Service Beans every 10.00 cups
  Service Water every 7.00 cups
  Service Beans and Water every 4.12 cups
  WomanWithCat:ruby grahamellis$


The complete example, together with the add and "tostring" methods used to redefine addition, may be found [here].

Python

In Python, everything's an object and so it's perhaps the most natural language in which to override operators - in fact operators are no more than "syntactic icing" around the language's object syntax in the first place!

Source code calling up the methods will look like:

  if __name__ == "__main__":
    beans = mtbs(10,"Beans")
    water = mtbs(7,"Water")
    fill = beans + water
    print beans
    print water
    print fill


Which runs as follows:

  WomanWithCat:ruby grahamellis$ python overload_add.py
  Beans every 10.00
  Water every 7.00
  Beans and Water every 4.12
  WomanWithCat:ruby grahamellis$


Full source code for the complete example, including definition of the __add__ method, may be found [here].

With Python, note that as well as the __add__ method to overload addition based on the obejct to the left of the + sign, you can also provide a __radd__ method to overload the object to the right, and an __iadd__ method to overload the += operator.

Ruby

You define addition on your own objects in Ruby by defining a method called "+" in the class you want to be able to add - beautifuly simple. Here's the calling code:

  if __FILE__ == $0
    beans = Mtbs.new(10,"Beans")
    water = Mtbs.new(7,"Water")
    fill = beans + water
    print beans
    print water
    print fill
  end


And the result from running that code:

  WomanWithCat:ruby grahamellis$ ruby overload_add.rb
  Every 10.00 service Beans
  Every 7.00 service Water
  Every 4.12 service Beans or Water
  You have new mail in /var/mail/grahamellis
  WomanWithCat:ruby grahamellis$


The complete code, including the definition of the class, may be found [here].

PHP and Java

PHP and Java do not support operator overloading, partly on a matter of principle and partly because the folks who look after the languages don't see a need for it. They're probably correct in that assessment, as languages do differ from one another and the very obvious gains that operator overriding has in language such as Python and Ruby are by no means obviously advantages in either Java or PHP.

Lua

In lua, you can define the __add method in a metatable, and associate that metatable with any other table you wish, which will result in you changing the character of what the + operator does when applied to that table. So you can write code like

  if __FILE__ == $0
    beans = Mtbs.new(10,"Beans")
    water = Mtbs.new(7,"Water")
    fill = beans + water
    print beans
    print water
    print fill
end


which produced results like

  WomanWithCat:ruby grahamellis$ lua overload_add.lua
  Attention needed for Beans every 10.00 cups
  Attention needed for Water every 7.00 cups
  Attention needed for Beans plus Water every 4.12 cups
  WomanWithCat:ruby grahamellis$


The complete example, including setting up the tables with Mtbs characeristics, may be found [here].

Tcl

Alone amongst the languages that we teach, Tcl does not have natural objects nor method overrides, although there is an object capability within IncrTcl.




Operator overload is a bit specialist on many of our courses - we'll cover it on an as-requeired basis, but these examples are always available to get your started. Our course descriptions / public schedule is [here] .. please ask if you want private training on site, or coverage of specific intermediate or advanced topics - we can often help!
WomanWithCat:ruby grahamellis$

(written 2014-12-26, updated 2014-12-30)

 
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
H108 - Objects in PHP
  [67] Object Oriented Programming in PHP - (2004-09-29)
  [124] PHP v Java - (2004-11-20)
  [205] PHP5 lets you say no - (2005-02-07)
  [343] Should I use structured or object oriented? - (2005-06-10)
  [421] Don't repeat code - use loops or functions - (2005-08-21)
  [485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
  [656] Think about your design even if you don't use full UML - (2006-03-24)
  [720] Planning a hotel refurb - an example of a Gant chart in PHP - (2006-05-14)
  [836] Build on what you already have with OO - (2006-08-17)
  [1027] Cue the music, I'm happy. - (2007-01-09)
  [1153] Object Oriented Model - a summary of changes from PHP4 to PHP5 - (2007-04-18)
  [1217] What are factory and singleton classes? - (2007-06-04)
  [1535] OO PHP demonstration - comparing objects and more - (2008-02-08)
  [1682] Accounts in PHP - an OO demo - (2008-06-19)
  [1819] Calling base class constructors - (2008-10-03)
  [1820] Sorting objects in PHP - (2008-10-04)
  [1925] Introduction to Object Oriented Programming - (2008-12-06)
  [2160] PHP - getclass v instanceof - (2009-05-07)
  [2169] When should I use OO techniques? - (2009-05-11)
  [2171] Cleaning up redundant objects - (2009-05-11)
  [2172] PHP4 v PHP5 - Object Model Difference - (2009-05-11)
  [2380] Object Oriented programming - a practical design example - (2009-08-27)
  [2434] Abstract classes, Interfaces, PHP and Java - (2009-10-03)
  [2435] Serialization - storing and reloading objects - (2009-10-04)
  [2632] Shipping a test harness with your class in PHP - (2010-02-12)
  [2641] Object Oriented Programming in PHP - (2010-02-19)
  [2680] Static class members in PHP - a documented example - (2010-03-16)
  [2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
  [2741] What is a factory? - (2010-04-26)
  [2774] PHP - Object Oriented Design in use - (2010-05-21)
  [2921] Does copying a variable duplicate the contents? - (2010-08-14)
  [2922] Getting the OO design write - with PHP a example - (2010-08-14)
  [3142] Private and Public - and things between - (2011-01-22)
  [3210] Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22)
  [3211] Computer Graphics in PHP - World (incoming data) to Pixel (screen) conversion - (2011-03-24)
  [3607] Designing your application - using UML techniques - (2012-02-11)
  [3608] Design Patterns - what are they? Why use them? - (2012-02-12)
  [3609] How do classes relate to each other? Associated Classes - (2012-02-12)
  [3840] Autoload in PHP - (2012-08-17)
  [3841] Copying, duplicating, cloning an object in PHP - (2012-08-18)
  [3843] Caching Design Patterns - (2012-08-20)
  [3953] Objects in PHP - Revision - (2012-12-16)
  [4057] stdClass in PHP - using an object rather than an associative array - (2013-04-02)
  [4073] Learning about Object Orientation in PHP - a new set of examples - (2013-04-28)
  [4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
  [4626] Singleton design pattern - examples and uses - (2016-01-20)
  [4627] Caching results in an object for efficiency - avoiding re-calculation - (2016-01-20)
  [4628] Associative objects - one object within another. - (2016-01-20)

J710 - Java - Extending Classes and More
  [831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
  [1066] Final, Finally and Finalize - three special words in Java - (2007-02-05)
  [1294] An example of Java Inheritance from scratch - (2007-08-00)
  [1501] Java - using super to call a method in the parent class - (2008-01-10)
  [1538] Teaching Object Oriented Java with Students and Ice Cream - (2008-02-12)
  [1556] Java - a demonstration of inheritance on just one page - (2008-02-26)
  [2185] Abstract Classes - Java - (2009-05-16)
  [2604] Tips for writing a test program (Ruby / Python / Java) - (2010-01-29)
  [2860] What methods are available on this Java object? - (2010-07-08)
  [3047] What is a universal superclass? Java / Perl / Python / Other OO languages - (2010-11-13)
  [4334] Splitting out code into name blocks for clarity and reusability - (2014-11-30)
  [4394] Philosophy behind object design - and how I applied in to a Java example - (2015-01-14)
  [4419] Java Inheritance example - group of classes - step by step - (2015-02-08)
  [4422] Objects - from physical to virtual or abstract - Java - (2015-02-10)

U108 - Lua - Pattern matching
  [1744] Lua examples, Lua Courses - (2008-08-08)
  [1847] Lua - IAQ (Infrequently Answered Questions) - (2008-10-18)
  [2383] Lua Regular Expressions - (2009-08-28)
  [2702] First and last match with Regular Expressions - (2010-04-02)
  [2727] Making a Lua program run more than 10 times faster - (2010-04-16)
  [3687] Binary / bitwise operations in Lua with the standard bit32 library - (2012-04-06)

Y112 - Python - Objects - Intermediate
  [296] Using a Python dictionary as a holder of object attributes - (2005-04-30)
  [383] Overloading of operators on standard objects in Python - (2005-07-19)
  [477] Class, static and unbound variables - (2005-10-25)
  [903] Pieces of Python - (2006-10-23)
  [964] Practical polymorphism in action - (2006-12-04)
  [1146] __new__ v __init__ - python constructor alternatives? - (2007-04-14)
  [1517] Python - formatting objects - (2008-01-24)
  [1644] Using a utility method to construct objects of different types - Python - (2008-05-17)
  [1661] Equality, sameness and identity - Python - (2008-05-31)
  [2368] Python - fresh examples of all the fundamentals - (2009-08-20)
  [2409] TypeError: super() argument 1 must be type, not classobj (Python) - (2009-09-18)
  [2485] How do I set up a constant in Python? - (2009-10-31)
  [2693] Methods that run on classes (static methods) in Python - (2010-03-25)
  [2720] Multiple inheritance in Python - complete working example - (2010-04-14)
  [2722] Mixins example in Python - (2010-04-14)
  [2764] Python decorators - your own, staticmethod and classmethod - (2010-05-14)
  [2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
  [2889] Should Python classes each be in their own file? - (2010-07-27)
  [2905] Defining static methods in Python - (2010-08-05)
  [2994] Python - some common questions answered in code examples - (2010-10-10)
  [3002] A list of special method and attribute names in Python - (2010-10-17)
  [3442] A demonstration of how many Python facilities work together - (2011-09-16)
  [3472] Static variables in functions - and better ways using objects - (2011-10-10)
  [3524] Metaclasses (Python) and Metatables (Lua) - (2011-11-17)
  [3796] Backquote, backtic, str and repr in Python - conversion object to string - (2012-07-05)
  [3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
  [4028] Really Simple Class and Inheritance example in Python - (2013-03-04)
  [4094] Python Properties - how and why - (2013-05-18)
  [4344] Python base and inherited classes, test harness and unit testing - new examples - (2014-12-07)
  [4410] A good example of recursion - a real use in Python - (2015-02-01)
  [4449] Spike solution, refactoring into encapsulated object methods - good design practise - (2015-03-05)
  [4450] Deciding whether to use parameters, conditional statements or subclasses - (2015-03-05)
  [4541] Setting up and tearing down with the Python with keyword - (2015-10-16)
  [4649] Object and Static methods - what is the difference; example in Python 3 - (2016-02-17)
  [4717] with in Python - examples of use, and of defining your own context - (2016-11-02)
  [4718] Defining an object that is a modified standard type in Python - (2016-11-02)
  [4719] Nesting decorators - (2016-11-02)

P218 - Perl - More Objects
  [227] Bellringing and Programming and Objects and Perl - (2005-02-25)
  [246] When to bless a Perl variable - (2005-03-15)
  [531] Packages in packages in Perl - (2005-12-16)
  [588] Changing @INC - where Perl loads its modules - (2006-02-02)
  [592] NOT Gone phishing - (2006-02-05)
  [930] -> , >= and => in Perl - (2006-11-18)
  [1320] Perl for Larger Projects - Object Oriented Perl - (2007-08-25)
  [1435] Object Oriented Programming in Perl - Course - (2007-11-18)
  [1664] Example of OO in Perl - (2008-06-03)
  [1665] Factory method example - Perl - (2008-06-04)
  [1949] Nuclear Physics comes to our web site - (2008-12-17)
  [2427] Operator overloading - redefining addition and other Perl tricks - (2009-09-27)
  [2651] Calculation within objects - early, last minute, or cached? - (2010-02-26)
  [2811] Igloos melt in the summer, but houses do not - (2010-06-15)
  [2876] Different perl examples - some corners I rarely explore - (2010-07-18)
  [2972] Some more advanced Perl examples from a recent course - (2010-09-27)
  [3097] Making Perl class definitions more conventional and shorter - (2010-12-20)
  [3098] Learning Object Orientation in Perl through bananas and perhaps Moose - (2010-12-21)
  [3377] What do I mean when I add things in Perl? - (2011-08-02)
  [3581] Perl - calls to methods that use => - what do they mean? - (2012-01-16)
  [3941] Building an object based on another object in Perl - (2012-12-03)
  [4096] Perl design patterns example - (2013-05-20)
  [4098] Using object orientation for non-physical objects - (2013-05-22)

C234 - C and C based languages - Further C++ Object Oriented features
  [801] Simple polymorphism example - C++ - (2006-07-14)
  [802] undefined reference to typeinfo - C++ error message - (2006-07-15)
  [1159] It can take more that one plus one to get two. - (2007-04-22)
  [2004] Variable Scope in C++ - (2009-01-22)
  [2005] Variables and pointers and references - C and C++ - (2009-01-23)
  [2576] What does const mean? C and C++ - (2010-01-15)
  [2673] Multiple Inheritance in C++ - a complete example - (2010-03-12)
  [2849] What are C++ references? Why use them? - (2010-07-02)
  [3057] Lots of things to do with and within a C++ class - (2010-11-16)
  [3069] Strings, Garbage Collection and Variable Scope in C++ - (2010-11-25)
  [3124] C++ - putting the language elements together into a program - (2011-01-08)
  [3238] Bradshaw, Ben and Bill. And some C and C++ pointers and references too. - (2011-04-09)
  [3430] Sigils - the characters on the start of variable names in Perl, Ruby and Fortran - (2011-09-10)
  [3509] Operator Overloading, Exceptions, Pointers, References and Templates in C++ - new examples from our courses - (2011-11-06)
  [3982] Using a vector within an object - C++ - (2013-01-19)
  [4377] Designing a base class and subclasses, and their extension, in C++ - (2015-01-01)
  [4559] When do I use the this keyword in C++? - (2015-10-29)

R108 - Ruby - More Classes and Objects
  [184] MTBF of coffee machines - (2005-01-20)
  [1587] Some Ruby programming examples from our course - (2008-03-21)
  [2292] Object Orientation in Ruby - intermediate examples - (2009-07-16)
  [2601] Ruby - is_a? v instance_of? - what is the difference? - (2010-01-27)
  [2603] Ruby objects - a primer - (2010-01-29)
  [2616] Defining a static method - Java, Python and Ruby - (2010-02-01)
  [2620] Direct access to object variable (attributes) in Ruby - (2010-02-02)
  [2623] Object Oriented Ruby - new examples - (2010-02-03)
  [2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
  [2980] Ruby - examples of regular expressions, inheritance and polymorphism - (2010-10-02)
  [3154] Changing a class later on - Ruby - (2011-02-02)
  [3158] Ruby training - some fresh examples for string handling applications - (2011-02-05)
  [3260] Ruby - a training example that puts many language elements together to demonstrate the whole - (2011-04-23)
  [3760] Why you should use objects even for short data manipulation programs in Ruby - (2012-06-10)
  [3781] Private, Protected, Public in Ruby. What about interfaces and abstract classes in Ruby? - (2012-06-23)
  [3782] Standard methods available on all objects in Ruby - (2012-06-23)
  [4504] Where does Ruby load modules from, and how to load from current directory - (2015-06-03)
  [4550] Build up classes into applications sharing data types in Ruby - (2015-10-23)
  [4551] Testing your new class - first steps with cucumber - (2015-10-23)


Back to
The changing face of Christmas
Previous and next
or
Horse's mouth home
Forward to
A year of rail memories!
Some other Articles
Conditionals, loops and methods in Ruby - a primer with simple examples
Ruby - the second rung of learning the language
Shuffling a list - Ruby and Python
A year of rail memories!
Changing what operators do on objects - a comparison across different programming languages
The changing face of Christmas
Christmas day in Melksham
A quiet evening in Melksham - awaiting Santa
What a difference a year makes
Multiple yields and no loops in a Python generator?
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page


This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2024: 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/4366_Cha ... uages.html • PAGE BUILT: Sun Oct 11 16:07:41 2020 • BUILD SYSTEM: JelliaJamb