Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Desafío: Polimorfismo | Principios de POO
C# Más Allá de lo Básico

bookDesafío: Polimorfismo

El siguiente programa contiene una superclase llamada Shape y tres clases derivadas llamadas Rectangle, Square y Circle. El problema con el código es que los métodos no están correctamente sobrescritos, ya que la salida muestra 0.0 para las tres sentencias de Console.WriteLine, lo que implica que se están ejecutando los métodos de la clase base en lugar de los métodos de las clases derivadas.

Modifica el código de manera que los dos métodos, getArea y calculatePerimeter, sean correctamente sobrescritos.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
using System; using System.Collections.Generic; class Shape { // Perimeter is the length of the 'outline' of a shape public float perimeter; // Change code below this line public float getArea() { return 0.0f; } protected float calculatePerimeter() { return 0.0f; } // Change code above this line } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = this.calculatePerimeter(); } // Change code below this line public float getArea() { return width * height; } protected float calculatePerimeter() { return width * 2 + height * 2; } // Change code above this line } class Square : Shape { float length; public Square(float length) { this.length = length * length; this.perimeter = calculatePerimeter(); } // Change code below this line public float getArea() { return length * length; } protected float calculatePerimeter() { return 4 * length; } // Change code above this line } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; this.perimeter = calculatePerimeter(); } // Change code below this line public float getArea() { return 3.14f * radius * radius; } protected float calculatePerimeter() { return 2.00f * 3.14f * radius; } // Change code above this line } class ConsoleApp { static void Main() { List<Shape> shapes = new List<Shape>(); shapes.Add(new Rectangle(10f, 20f)); shapes.Add(new Square(10f)); shapes.Add(new Circle(10f)); foreach (Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }
  1. En la clase base, utiliza la palabra clave virtual para que los métodos puedan ser sobrescritos.
  2. En cada clase derivada, agrega la palabra clave override en las definiciones de los métodos.
index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
using System; using System.Collections.Generic; class Shape { // Perimeter is the length of the 'outline' of a shape public float perimeter; // Change code below this line public virtual float getArea() { return 0.0f; } protected virtual float calculatePerimeter() { return 0.0f; } // Change code above this line } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = this.calculatePerimeter(); } // Change code below this line public override float getArea() { return width * height; } protected override float calculatePerimeter() { return width * 2 + height * 2; } // Change code above this line } class Square : Shape { float length; public Square(float length) { this.length = length * length; this.perimeter = calculatePerimeter(); } // Change code below this line public override float getArea() { return length * length; } protected override float calculatePerimeter() { return 4 * length; } // Change code above this line } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; this.perimeter = calculatePerimeter(); } // Change code below this line public override float getArea() { return 3.14f * radius * radius; } protected override float calculatePerimeter() { return 2.00f * 3.14f * radius; } // Change code above this line } class ConsoleApp { static void Main() { List<Shape> shapes = new List<Shape>(); shapes.Add(new Rectangle(10f, 20f)); shapes.Add(new Square(10f)); shapes.Add(new Circle(10f)); foreach (Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 5

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

Can you show me the original code so I can help edit it?

Can you explain what the expected output should be after fixing the code?

Do you need an explanation of how `virtual` and `override` work in C#?

Awesome!

Completion rate improved to 2.04

bookDesafío: Polimorfismo

Desliza para mostrar el menú

El siguiente programa contiene una superclase llamada Shape y tres clases derivadas llamadas Rectangle, Square y Circle. El problema con el código es que los métodos no están correctamente sobrescritos, ya que la salida muestra 0.0 para las tres sentencias de Console.WriteLine, lo que implica que se están ejecutando los métodos de la clase base en lugar de los métodos de las clases derivadas.

Modifica el código de manera que los dos métodos, getArea y calculatePerimeter, sean correctamente sobrescritos.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
using System; using System.Collections.Generic; class Shape { // Perimeter is the length of the 'outline' of a shape public float perimeter; // Change code below this line public float getArea() { return 0.0f; } protected float calculatePerimeter() { return 0.0f; } // Change code above this line } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = this.calculatePerimeter(); } // Change code below this line public float getArea() { return width * height; } protected float calculatePerimeter() { return width * 2 + height * 2; } // Change code above this line } class Square : Shape { float length; public Square(float length) { this.length = length * length; this.perimeter = calculatePerimeter(); } // Change code below this line public float getArea() { return length * length; } protected float calculatePerimeter() { return 4 * length; } // Change code above this line } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; this.perimeter = calculatePerimeter(); } // Change code below this line public float getArea() { return 3.14f * radius * radius; } protected float calculatePerimeter() { return 2.00f * 3.14f * radius; } // Change code above this line } class ConsoleApp { static void Main() { List<Shape> shapes = new List<Shape>(); shapes.Add(new Rectangle(10f, 20f)); shapes.Add(new Square(10f)); shapes.Add(new Circle(10f)); foreach (Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }
  1. En la clase base, utiliza la palabra clave virtual para que los métodos puedan ser sobrescritos.
  2. En cada clase derivada, agrega la palabra clave override en las definiciones de los métodos.
index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
using System; using System.Collections.Generic; class Shape { // Perimeter is the length of the 'outline' of a shape public float perimeter; // Change code below this line public virtual float getArea() { return 0.0f; } protected virtual float calculatePerimeter() { return 0.0f; } // Change code above this line } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = this.calculatePerimeter(); } // Change code below this line public override float getArea() { return width * height; } protected override float calculatePerimeter() { return width * 2 + height * 2; } // Change code above this line } class Square : Shape { float length; public Square(float length) { this.length = length * length; this.perimeter = calculatePerimeter(); } // Change code below this line public override float getArea() { return length * length; } protected override float calculatePerimeter() { return 4 * length; } // Change code above this line } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; this.perimeter = calculatePerimeter(); } // Change code below this line public override float getArea() { return 3.14f * radius * radius; } protected override float calculatePerimeter() { return 2.00f * 3.14f * radius; } // Change code above this line } class ConsoleApp { static void Main() { List<Shape> shapes = new List<Shape>(); shapes.Add(new Rectangle(10f, 20f)); shapes.Add(new Square(10f)); shapes.Add(new Circle(10f)); foreach (Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 5
some-alt