# operator overloading  +   < 

'''class watertank:
    def __init__(self, qut, own):
        self.own = own
        self.quantity = qut

    def __add__(self, w1): #  +
        return self.quantity + w1.quantity
    
    def __mul__(self, w1): #  *
        return self.quantity * w1.quantity


o1 = watertank(2, "A")
o2 = watertank(5, "B")

print( o1 + o2 ) 
print( o1 * o2 ) 
'''

# Composition   has-a
'''
class Cake:
    def __init__(self, name):
        self.name = name

class Watch:
    def __init__(self, name):
        self.name = name

class present:  # name 
    def __init__(self, name, cake, watch):
        self.name = name
        self.cake = Cake("cho.") # object from the Cake class
        self.watch = Watch("classic")
    def __str__(self):
        return f"hamada ibrahim abdulwakel"
    
c = Cake("cho.")
w = Watch("classic")
p = present("hamada", c, w)
print(p)
'''


# Inhertance  is-a
class shape:
    def __init__(self, name):
        self.name = name
    def getShapeName(self):
        pass
    def getArea(self):
        pass   

class traingle(shape):
        def __init__(self, name, a, b, c):
                shape.__init__(self, name)
                self.side1 = a
                self.side2 = b
                self.side3 = c
        def getArea(self):
              return self.side1 + self.side2 + self.side3 

class rectangle(shape):
        def __init__(self, name, a, b):
                shape.__init__(self, name)
                self.side1 = a
                self.side2 = b
        def getArea(self):
              return self.side1 * self.side2 
        

t = traingle("x", 1, 2, 3)
print(t.getArea())

r = rectangle("y", 5, 5)
print( r.getArea() )


# Polymorphism