//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
using System;

namespace Testing
{
	class Shape
	{
		public virtual void Draw()
		{
			Console.WriteLine("Rysowanie kształtu");
		}
	}
	
	class Circle: Shape
	{
		double x;
		double y;
		double r;
		public Circle(double x, double y, double r)
		{
			this.x = x;
			this.y = y;
			this.r = r;
		}
		override public void Draw()
		{
			Console.WriteLine("Rysowanie okręgu o promieniu {0}", r);
		}
	}
	
	class Triangle: Shape
	{
		double [,] vertices;
		public Triangle(double x1, double y1,
		                double x2, double y2,
		                double x3, double y3)
		{
			vertices = new double [,] {{x1, y1},
			                           {x2, y2},
			                           {x3, y3}};
		}
		override public void Draw()
		{
			Console.WriteLine("Rysowanie trójkąta");
		}
	}
	
	class Square: Shape
	{
		double x;
		double y;
		double s;
		public Square(double x, double y, double s)
		{
			this.x = x;
			this.y = y;
			this.s = s;
		}
		override public void Draw()
		{
			Console.WriteLine("Rysowanie kwadratu {0}x{0}", s);
		}
	}
	
	class PolymorphicMain
	{
		static void Main(string[] args)
		{
			Shape [] shapes = new Shape [] {new Circle(0,0,2),
											new Triangle(0,0,0,1,1,1),
											new Square(0,0,5)};
			foreach(Shape s in shapes)
			{
				s.Draw();
			}
		}
	}
}
