Descripción - Ejercicio de la Clase
-
Create a superclass called
Shape(), which is the base of the classesReactangle()andSquare(), define the methods computearea and compute_perimeter inShape()and then using polymorphism redefine the methods properly in _Rectangle and in Square. -
Using the classes
Point()andLine()define a new super-classShape()with the following structure:
classDiagram
class Shape {
+ vertices: list(Point)
+ edges: list(Line)
+ inner_angles: list(float)
+ is_regular: bool
+ compute_area(self)
+ compute_perimeter(self)
+ compute_inner_angles(self)
}
class Point {
+ x: int
+ y: int
+ compute_distance(self, Point)
}
class Line {
+ start_point: Point
+ end_point: Point
+ length: float
}
class Triangle {
}
class Isosceles{
}
class Equilateral{
}
class Scalene{
}
class TriRectangle{
}
class Rectangle{
}
class Square{
}
Shape *-- Line
Shape *-- Point
Triangle --|> Shape
Isosceles --|> Triangle
Equilateral --|> Triangle
Scalene --|> Triangle
TriRectangle --|> Triangle
Rectangle --|> Shape
Square --|> Rectangle
Use Inheritance, Composition, Encapsulation and Polymorphism to define the classes. All attributes must have their respective setters and getters.
-
Clase
Point(Punto):- Representa un punto en un plano bidimensional con dos coordenadas,
xyy. - Se incluyen métodos para obtener y modificar estos valores mediante los métodos getter y setter, que controlan el acceso a las coordenadas.
- Además, tiene un método para calcular la distancia entre dos puntos utilizando la fórmula de la distancia euclidiana.
- Representa un punto en un plano bidimensional con dos coordenadas,
-
Clase
Line(Línea):- Representa una línea en el plano definida por dos puntos,
start(inicio) yend(fin). - La longitud de la línea se calcula utilizando el método
compute_length, que llama a la funcióncompute_distancede la clasePointpara determinar la distancia entre los dos puntos que definen la línea. - También permite modificar los puntos de inicio y fin, y recalcula la longitud de la línea cuando estos cambian.
- Representa una línea en el plano definida por dos puntos,
-
Clase
Shape(Figura):- Es una clase base abstracta para todas las figuras geométricas. Define métodos que deben ser implementados por las clases hijas, como
vertices,edges,inner_angles,compute_area,compute_perimeteryis_regular. - El método
is_regularse deja para que cada clase hija lo implemente según sus características específicas, como en el caso de los rectángulos o triángulos regulares.
- Es una clase base abstracta para todas las figuras geométricas. Define métodos que deben ser implementados por las clases hijas, como
-
Clase
Rectangle(Rectángulo):- Representa un rectángulo en un plano bidimensional.
- El rectángulo puede ser inicializado de diferentes maneras: especificando la esquina inferior izquierda y el ancho y alto; el centro y el ancho y alto; o las dos esquinas opuestas.
- Implementa los métodos para obtener los vértices, las aristas (líneas), los ángulos internos (siempre 90° para un rectángulo), el área y el perímetro.
- Además, determina si el rectángulo es regular (es decir, si sus lados son iguales, lo que lo convertiría en un cuadrado).
-
Clase
Square(Cuadrado):- Hereda de
Rectangle, ya que un cuadrado es un caso especial de rectángulo donde los lados son iguales. - El constructor toma la esquina inferior izquierda y el largo del lado, y pasa estos valores al constructor de
Rectangle. - Sobrescribe el método
compute_areapara calcular el área de un cuadrado y ajusta la salida del método__str__para mostrar "Cuadrado" en lugar de "Rectángulo".
- Hereda de
-
Clase
Triangle(Triángulo):- Representa un triángulo definido por tres vértices (
v1,v2yv3). - Implementa un método para verificar si los tres puntos forman un triángulo válido utilizando la regla de los triángulos: la suma de las longitudes de cualquier par de lados debe ser mayor que la longitud del tercer lado.
- La clase también permite acceder y modificar los vértices del triángulo.
- Representa un triángulo definido por tres vértices (
-
Clase
RightTriangle(Triángulo Rectángulo):- Hereda de la clase
Triangley representa un triángulo rectángulo, que es un tipo especial de triángulo donde uno de los ángulos es de 90 grados. - El constructor toma tres vértices como parámetros, pero el triángulo debe cumplir con la condición de ser un triángulo rectángulo, lo que significa que uno de sus ángulos debe ser de 90 grados.
- Para determinar si el triángulo es rectángulo, la clase implementa un método
is_right_triangle, que usa el teorema de Pitágoras. Este teorema establece que en un triángulo rectángulo, el cuadrado de la hipotenusa es igual a la suma de los cuadrados de los otros dos lados. Si esta condición se cumple, el triángulo es rectángulo. - Además, tiene un método para calcular el área y el perímetro específico de un triángulo rectángulo.
- Hereda de la clase
-
Clase
EquilateralTriangle(Triángulo Equilátero):- Hereda también de
Triangley representa un triángulo equilátero, donde todos sus lados son iguales y todos sus ángulos son de 60 grados. - El constructor de esta clase toma un solo parámetro para el lado del triángulo, ya que, en un triángulo equilátero, todos los lados tienen la misma longitud.
- Implementa un método para calcular el área de un triángulo equilátero utilizando la fórmula estándar para este tipo de triángulo.
- También sobrescribe el método
is_regularpara devolverTrue, ya que un triángulo equilátero siempre es regular (tiene lados y ángulos iguales).
- Hereda también de
-
Clase
ScaleneTriangle(Triángulo Escaleno):- Hereda de la clase
Triangley representa un triángulo escaleno, en el cual todos sus lados tienen longitudes diferentes y, por lo tanto, también sus ángulos son diferentes. - El constructor recibe tres vértices como parámetros y calcula la longitud de cada lado utilizando la distancia entre los puntos.
- Implementa un método para verificar si un triángulo es escaleno, comprobando si las longitudes de los tres lados son diferentes. Si las longitudes de los tres lados son distintas, el triángulo es escaleno.
- Además, sobrescribe el método
is_regularpara devolverFalse, ya que un triángulo escaleno nunca será regular.
- Hereda de la clase
-
Clase
IsoscelesTriangle(Triángulo Isósceles):
- Hereda de la clase
Triangley representa un triángulo isósceles, que tiene al menos dos lados de igual longitud. - Al igual que las otras clases, el constructor recibe tres vértices como parámetros, y calcula la longitud de los lados.
- La clase implementa un método para verificar si el triángulo es isósceles, comprobando si al menos dos de sus lados tienen la misma longitud.
- También sobrescribe el método
is_regularpara devolverFalseen este caso, ya que, aunque tiene dos lados iguales, no tiene todos los lados iguales como un triángulo equilátero.
The restaurant revisted
-
Add setters and getters to all subclasses for menu item.
-
Override calculate_total_price() according to the order composition (e.g if the order includes a main course apply some disccount on beverages).
-
Add the class Payment() following the class example.
Funcionalidad del Código:
Este código define un sistema básico para gestionar un menú de restaurante, hacer pedidos y procesar pagos.
La clase base se llama MenuItem. Básicamente, esta es la estructura principal de cualquier artículo del menú, ya sea una bebida, un plato fuerte o un postre. Cada artículo tiene tres atributos principales: el nombre, el precio y un descuento opcional. Además, tiene validaciones para asegurarse de que los valores sean válidos, como que el precio sea positivo y el descuento esté entre 0 y 1.
-
Por ejemplo, si creamos un artículo llamado 'Coca Cola' con un precio de $2.50 y un descuento del 20%, la clase calcula automáticamente el precio con descuento. También tiene métodos llamados 'getters' y 'setters' que nos permiten obtener o cambiar esos valores de manera controlada.
-
Además, hay un método
**str**que define cómo se ve la información del artículo cuando se imprime. Esto es útil para mostrar el menú o un resumen del pedido.
Luego tenemos subclases como Beverage, Appetizers, SideDishes, MainCourses y Desserts. Estas subclases heredan de MenuItem y representan categorías específicas del menú.
Después viene la clase Order, que gestiona todo el pedido del cliente. Es como una canasta donde se guardan los artículos seleccionados. Tiene un método llamado add_item para agregar cosas al pedido, y otros métodos para calcular el precio total.
- Un detalle interesante aquí es que si el pedido incluye un plato principal, se aplica un descuento adicional del 10% a las bebidas. Este tipo de reglas de negocio están encapsuladas en el método
calculate_total_price.
Cuando ya tienes el pedido listo, la clase Payment se encarga de procesar el pago. Puedes elegir entre pagar en efectivo o con tarjeta, y el método process_payment calcula el total y confirma que el pago se ha realizado.
- Por ejemplo, si el pedido total es de $20.50, la clase imprime algo como: 'Pago de $20.50 procesando usando tarjeta'.
Finalmente, tenemos una lista que actúa como nuestro menú. Cada artículo es una instancia de las clases que mencionamos antes, como Beverage o MainCourses. Esto nos permite crear pedidos personalizados para los clientes.
- En el ejemplo, se crea un pedido con una bebida, un aperitivo, un acompañamiento, un plato principal y un postre. Luego se imprimen todos los artículos, el total sin descuentos adicionales y el total con los descuentos aplicados.
classDiagram
MenuItem <|-- Beverage
MenuItem <|-- Appetizers
MenuItem <|-- SideDishes
MenuItem <|-- MainCourses
MenuItem <|-- Desserts
MenuItem : +String name
MenuItem : +float price
MenuItem : +float discount
MenuItem : +calculate() float
MenuItem : +__str__() String
class MenuItem {
+String name
+float price
+float discount
+calculate() float
+__str__() String
}
class Beverage {
+String name
+float price
+float discount
+calculate() float
+__str__() String
}
class Appetizers {
+String name
+float price
+float discount
+calculate() float
+__str__() String
}
class SideDishes {
+String name
+float price
+float discount
+calculate() float
+__str__() String
}
class MainCourses {
+String name
+float price
+float discount
+calculate() float
+__str__() String
}
class Desserts {
+String name
+float price
+float discount
+calculate() float
+__str__() String
}
Order *-- MenuItem : contains
Order : +add_item(item MenuItem)
Order : +bill_amount() float
Order : +calculate_total_price() float
class Order {
+add_item(item: MenuItem)
+bill_amount() float
+calculate_total_price() float
}
Payment *-- Order : processes
Payment : +process_payment() String
class Payment {
+process_payment() String
}