# -*- encoding:Utf8 -*-

# Classes dérivées - Polymorphisme

class Cercle(object):
    """Définition d'une classe de cercles"""
    
    def __init__(self, rayon):
        self.rayon = rayon

    def surface(self):
        """
        surface() --> float
        Retourne la surface de l'instance traitée
        """
        return 3.1416 * self.rayon**2
        
class Cylindre(Cercle):
    """Définition d'une classe de cylindres dérivée de la classe Cercle"""
    
    def __init__(self, rayon, hauteur):
        Cercle.__init__(self, rayon) # surcharge du constructeur de la classe parente
        self.hauteur = hauteur
        
    def volume(self):
        """
        volume() --> float
        Retourne le volume de l'instance traitée
        """
        return self.surface()*self.hauteur
        
    # la méthode surface() est héritée de la classe parente
    
        
class Cone(Cylindre):
    """Définition d'une classe de cones dérivée de la classe Cylindre"""
    
    def __init__(self, rayon, hauteur):
        Cylindre.__init__(self, rayon, hauteur)
                
    def volume(self):
        return Cylindre.volume(self)/3        
        # cette nouvelle méthode volume() remplace celle que
        # l'on a héritée de la classe parente
        # (exemple de polymorphisme d'héritage)

# Programme de test :

if __name__ == '__main__':

    cyl = Cylindre(5, 7)
    print("Surf. de section du cylindre =", cyl.surface())
    print("Volume du cylindre =", cyl.volume())

    co = Cone(5,7)
    print("Surf. de base du cône =", co.surface())
    print("Volume du cône =", co.volume())

    input("Appuyez sur une touche pour fermer la fenetre !")
