Below is an attempt to compare the effects of inheritance, and its equivalence, on code size between OOP and a procedural equivalent. I used a pseudo-code style which attempts to not give any biased advantage to one side or the other.
The example below has a roughly even mix of inheritance and direct implementation (overrides) and an even mix of methods (operations) and subtypes (classes). Rather than describe the inheritance pattern used, I will use a table because I think tables are usually better at showing such patterns than code.
Method | |||||
Subclass | 1 | 2 | 3 | 4 | 5 |
A | I | - | - | - | - |
B | I | I | - | - | - |
C | I | I | I | - | - |
D | I | I | I | I | - |
E | I | I | I | I | I |
As you can see, the examples show no significant code-size advantage of one paradigm over the other in this little experiment. You will also notice that the complexity is roughly the same (subjectively judged due to the lack of agreed-upon metrics).
1 sub 1(handle) 2 // all share same implementation, thus no case statements 3 endSub 4 sub 2(handle) 5 select handle.type // the type field of table handle 6 case a 7 a2_blah... 8 case else // sometimes called "otherwise" 9 p2_blah... 10 endSub 11 sub 3(handle) 12 select handle.type 13 case a 14 a3_blah... 15 case b 16 b3_blah... 17 case else 18 p3_blah... 19 endSub 20 sub 4(handle) 21 select handle.type 22 case a 23 a4_blah... 24 case b 25 b4_blah... 26 case c 27 c4_blah... 28 case else 29 p4_blah... 30 endSub 31 sub 5(handle) 32 select handle.type 33 case a 34 a5_blah... 35 case b 36 b5_blah... 37 case c 38 c5_blah... 39 case d 40 d5_blah... 41 case else 42 p5_blah... 43 endSub
1 class Parent 2 method 1 3 p1_blah... 4 method 2 5 p2_blah... 6 method 3 7 p3_blah... 8 method 4 9 p4_blah... 10 method 5 11 p5_blah... 12 endClass 13 class A 14 method 2 15 a2_blah... 16 method 3 17 a3_blah... 18 method 4 19 a4_blah... 20 method 5 21 a5_blah... 22 endClass 23 class B 24 method 3 25 b3_blah... 26 method 4 27 b4_blah... 28 method 5 29 b5_blah... 30 endClass 31 class C 32 method 4 33 c4_blah... 34 method 5 35 c5_blah... 36 endClass 37 class D 38 method 5 39 d5_blah... 40 endClass 41 class E 42 // inherits all, thus no explicit methods 43 endClass