using System.Collections.Generic;
public static void Main()
List<Shape> shapes = new List<Shape>();
shapes.Add(new Rectangle(new Location(1, 1), 4, 5));
shapes.Add(new Triangle(new Location(1, 1), 3, 4, 3, 4, 5));
shapes.Add(new Circle(new Location(1, 1), 2));
foreach (Shape s in shapes)
Console.WriteLine("Area = " + s.CalculateArea().ToString("F2"));
Console.WriteLine("Perimeter = " + s.CalculatePerimeter().ToString("F2"));
public double X { get; set; }
public double Y { get; set; }
public Location(double x, double y)
public class Location3D : Location
public double Z { get; set; }
public Location3D(double x, double y, double z) : base(x, y)
public Location Origin { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public virtual int NumberOfSides
public Shape(Location origin, double width, double height)
public virtual double CalculateArea()
public virtual double CalculatePerimeter()
public virtual void Draw()
Console.WriteLine("Performing base class drawing tasks");
public class Rectangle : Shape
public override int NumberOfSides
public Rectangle (Location origin, double width, double height) : base (origin, width, height)
public override double CalculateArea()
public override double CalculatePerimeter()
return 2 * (Width + Height);
public override void Draw()
Console.WriteLine("Performing rectangle drawing tasks");
public class Triangle : Shape
public override int NumberOfSides
public double SideALength { get; set; }
public double SideBLength { get; set; }
public double SideCLength { get; set; }
public Triangle (Location origin, double theBase, double height, double sideALength, double sideBLength, double sideCLength)
: base (origin, theBase, height)
SideALength = sideALength;
SideBLength = sideBLength;
SideCLength = sideCLength;
public override double CalculateArea()
return (Width * Height) / 2;
public override double CalculatePerimeter()
return SideALength + SideBLength + SideCLength;
public override void Draw()
Console.WriteLine("Performing triangle drawing tasks");
public class Circle : Shape
get { return Width / 2; }
public Circle(Location origin, double radius) : base(origin, radius * 2, radius * 2) {}
public override double CalculateArea()
return Math.PI * Math.Pow(Radius, 2);
public override double CalculatePerimeter()
return 2 * Math.PI * Radius;
public double CalculateCircumference()
return CalculatePerimeter();
public override void Draw()
Console.WriteLine("Performing circle drawing tasks");