using System.Collections.Generic;
public static void Main()
List<Shape> Shapes=new List<Shape>();
Shapes.Add(new Circle(3));
Shapes.Add(new Quadrilateral(3,3));
Shapes.Add(new Quadrilateral(3,4));
Shapes.Add(new Triangle(1,1,1));
Shapes.Add(new Triangle(1,2,2));
Shapes.Add(new Triangle(2,3,4));
SortByArea area=new SortByArea();
List<Shape> sortedAreaList=area.SortShapesByArea(Shapes);
Console.WriteLine("--- Shapes sorted by Area ---");
foreach(var shape in sortedAreaList){
Console.WriteLine(shape.ObjectShape+" "+shape.Area.ToString());
SortByPerimeter perimeter=new SortByPerimeter();
List<Shape> sortedPerimeterList=perimeter.SortShapesByPerimeter(Shapes);
Console.WriteLine("--- Shapes sorted by Perimeter ---");
foreach(var shape in sortedPerimeterList){
Console.WriteLine(shape.ObjectShape+" "+shape.Perimeter.ToString());
public interface ICalculateArea{
public interface ICalculatePerimeter{
void CalculatePerimeter();
public interface ICheckShape{
public interface IShape:ICalculateArea,ICalculatePerimeter,ICheckShape{
public interface ISortShapesByArea{
List<Shape> SortShapesByArea(List<Shape> Shapes);
public interface ISortShapesByPerimeter{
List<Shape> SortShapesByPerimeter(List<Shape> Shapes);
public class SortByArea:ISortShapesByArea{
public List<Shape> SortShapesByArea(List<Shape> Shapes){
Shapes.Sort((x, y) => y.Area.CompareTo(x.Area));
public class SortByPerimeter:ISortShapesByPerimeter{
public List<Shape> SortShapesByPerimeter(List<Shape> Shapes){
Shapes.Sort((x, y) => y.Perimeter.CompareTo(x.Perimeter));
public abstract class Shape:IShape{
public string ObjectShape{get;set;}
public double Area{get;set;}
public double Perimeter{get;set;}
public abstract void CalculateArea();
public abstract void CalculatePerimeter();
public abstract void CheckShape();
public class Circle:Shape{
public double Radius { get; set; }
public Circle(double _Radius){
public override void CalculateArea()
Area= 3.14*Radius*Radius;
public override void CalculatePerimeter()
Perimeter= 2*3.14*Radius;
public override void CheckShape(){
public class Quadrilateral:Shape,IShape{
public double Height { get; set; }
public double Width { get; set; }
public Quadrilateral(double _Height,double _Width){
public override void CalculateArea()
public override void CalculatePerimeter()
Perimeter= Height * 2 + Width * 2;
public override void CheckShape(){
ObjectShape= "rectangle";
public class Triangle:Shape,IShape{
public double Height { get; set;}
public double Side1 { get; set; }
public double Side2 { get; set; }
public double Side3 { get; set; }
public Triangle(double _Side1,double _Side2, double _Side3){
public override void CalculateArea()
double semiperimeter = (Side1 + Side2 + Side3) / 2;
Area= Math.Sqrt(semiperimeter * (semiperimeter - Side1) * (semiperimeter - Side2) * (semiperimeter - Side3));
public override void CalculatePerimeter()
Perimeter= Side1 + Side2 + Side3;
public override void CheckShape(){
if (Side1 ==Side2 && Side2 == Side3)
ObjectShape= "Equilateral Triangle";
else if (Side1 == Side2 || Side2== Side3|| Side3== Side1)
ObjectShape= "Isosceles Triangle";
ObjectShape= "Scalene Triangle";