Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which should inherit which?

Tags:

oop

puzzle

This is one of the boring academic OOP questions, but it is not a homework. I got the question from a newbie programmer about one of those stupid textbooks examples about OOP.

Imagine that you are designing a Square class and a Cube class, which should inherit which?

I see a relationship, but what it is, I can not really see!

Could you give me a logical argument with OOP in mind.

like image 404
Khaled Alshaya Avatar asked Nov 26 '22 22:11

Khaled Alshaya


2 Answers

Neither! Since a square is not a cube, and a cube is not a square, neither should inherit from the other. Square can inherit from polygon and cube can inherit from polyhedron, but the two are, themselves, mutually exclusive.

like image 180
Bob Kaufman Avatar answered Dec 04 '22 19:12

Bob Kaufman


There's no inheritance. Inheritance is a "is-a" relationship (Well, sometimes not even a "is-a" relationship, as mentioned in the link below). A cube is not a square, and a square is not a cube.

How would you construct, it depends on how you model. You could go with something like a cube has 6 squares (a cube is not, it has 6 squares; a composition), or a cube has a side size, just like square. But once there is no "is-a", an inheritance would be dangerous zone...

Also, in a inheritance, everything that is valid for the base class must be valid for the Derived one. It's the Square extends Rectangle problem. For instance:

Supposing Cube inherits Square: If your Square has a method changeArea(double area) and getSide(), the same should be possible for the Cube. But it is not, since the area of a cube is 6 times the area of a square (it has 6 squares).

Supposing Square inherits Cube: If your Cube has a setVolume(double volume) method, your square will be broken, once it has no volume

Finally, if you want to use inheritance, you could create a GeometryObjectWithEqualSides object, then both could inherit from it. :)

like image 33
Samuel Carrijo Avatar answered Dec 04 '22 19:12

Samuel Carrijo