:::: MENU ::::

Çok Biçimliliğin Faydaları ve Çok Biçimliliğe İlişkin Örnekler

Çok biçimlilik türden bağımsız kod parçalarının oluşturulması için kullanılabilmektedir. Örneğin bir oyun programında oynanan top bir sınıfla temsil edilsin bu sınıfın git isimli methodu topu hareket ettirsin fakat oyun içerisinde duruma göre farklı topların kullanılabileceğini düşünelim. İşte oyunda zıplayan top, patlak top, normal top gibi değişik biçimde hareket eden toplar bulunuyor olsun. Çok biçimli bir uygulamada biz bu git methodunu sanal bir method olarak yazıp, bunu türemiş sınıflarda override edebiliriz. Böylece programımızı top kavramı üzerinde genelleştirebiliriz.

public virtual void Git()

Top t = new NormalTop();
//…


t.Git();
//…

t.Git();
//… 

Bizim bu oyunda topu değiştirmemiz çok kolay olacaktır. Tek yapacağımız şey normal top nesnesi yaratmak yerine örneğin zıplayan top nesnesi yaratmaktır. Kodun diğer bölümlerini değiştirmeye gerek yoktur. Git() methodu duruma göre patlak topun, normal topun yada zıplayan topun gitmesini sağlar. Bu sayede biz oyuna yeni toplar ekleyebiliriz. Yine benzer biçimde bir tuğla kırma oyununda, oyunda söz konusu olan pek çok öğe çok biçimli olarak temsil edilebilir. Örneğin oyun için kullanılan Brick sınıfı şöyle olabilir.


	class Brick
	{
		private Rectangle m_rect;
		//...

		public virtual void Draw()
		{
			//...
		}
		public virtual void Break()
		{
			//...
		}
		//...
}

Kodun şöyle kullanıldığını düşünelim;


			Brick b = new Brick();
			//...

			if (falanca)
				b.Break();
			//...

			b.Draw();
 	 	//...

Bir tetris programı yazacak olalım, tetris programında programın kendisi bir sınıfla temsil edilebilir. Düşen şekiller sınıflarla temsil edilebilir. Her nekadar düşen şekiller farklı ise de bunların belirli özellikleri ortaktır. Şeklin düşmesi sola yada sağa hareket etmesi döndürülmesi çok biçimli eğlemlerdir. Herşekil düşmekte fakat kendine göre düşmektedir. Herşekil döndürülmekte fakat kendine göre döndürülmektedir. İşte tüm şekiller taban bir shape isimli sınıfından türetilmiş sınıflarla temsil edilebilir.

Taban shape sınıfının çeşitli sanal methodları bulunuyor olabilir. Shape sınıfından türetilen sınıflar bu sanal methodları override edebilir. Örneğin;


using System;
namespace CSD
{
	class Shape
	{
		public virtual void MoveDown()
		{ }
		public virtual void MoveLeft()
		{ }
		public virtual void MoveRight()
		{ }
		public virtual void Rotate()
		{ }
	}
	class BarShape : Shape
	{
		public override void MoveDown()
		{
			Console.WriteLine("BarShape.MoveDown");
		}
		public override void MoveLeft()
		{
			Console.WriteLine("BarShape.MoveLeft");

		}
		public override void MoveRight()
		{
			Console.WriteLine("BarShape.MoveRight");

		}
		public override void Rotate()
		{
			Console.WriteLine("BarShape.Rotate");

		}
		//...
	}
	class TShape : Shape
	{
		public override void MoveDown()
		{
			Console.WriteLine("TShape.MoveDown");
		}
		public override void MoveLeft()
		{
			Console.WriteLine("TShape.MoveLeft");

		}
		public override void MoveRight()
		{
			Console.WriteLine("TShape.MoveRight");

		}
		public override void Rotate()
		{
			Console.WriteLine("TShape.Rotate");

		}
		//...
	}
	class ZShape : Shape
	{
		public override void MoveDown()
		{
			Console.WriteLine("ZShape.MoveDown");
		}
		public override void MoveLeft()
		{
			Console.WriteLine("ZShape.MoveLeft");

		}
		public override void MoveRight()
		{
			Console.WriteLine("ZShape.MoveRight");

		}
		public override void Rotate()
		{
			Console.WriteLine("ZShape.Rotate");

		}
		//...
	}
	class SquareShape : Shape
	{
		public override void MoveDown()
		{
			Console.WriteLine("SquareShape.MoveDown");
		}
		public override void MoveLeft()
		{
			Console.WriteLine("SquareShape.MoveLeft");

		}
		public override void MoveRight()
		{
			Console.WriteLine("SquareShape.MoveRight");

		}
		public override void Rotate()
		{
			Console.WriteLine("SquareShape.Rotate");

		}
		//...
	}
	class LShape : Shape
	{
		public override void MoveDown()
		{
			Console.WriteLine("LShape.MoveDown");
		}
		public override void MoveLeft()
		{
			Console.WriteLine("LShape.MoveLeft");

		}
		public override void MoveRight()
		{
			Console.WriteLine("LShape.MoveRight");

		}
		public override void Rotate()
		{
			Console.WriteLine("LShape.Rotate");

		}
		//...
	}
}

Oyunun kendisi Tetris isimli bir sınıfla temsil edilebilir ve bu sınıfın Run() methodu oyunu başlatabilir.


namespace CSD
{
	class App
	{
		public static void Main()
		{
			Tetris tetris = new Tetris();

			tetris.Run();
		}
	}

	class Tetris
	{
		public void Run()
		{
			//...
		}
		//...
	}
}


using System;
namespace CSD
{
	class App
	{
		public static void Main()
		{
			Tetris tetris = new Tetris();

			tetris.Run();
		}
	}

	class Tetris
	{
		private Random m_rand;
		public Tetris()
		{
			m_rand = new Random();
		}
		public void Run()
		{
			Shape shape;

			for (; ; )
			{
				shape = getRandomShape();
				//...
				shape.MoveDown();
				//...
				shape.MoveLeft();
			}
		}

		private Shape getRandomShape()
		{
			Shape shape = null;

			switch ((ShapeType)m_rand.Next(5))
			{
				case ShapeType.BarShape:
					shape = new BarShape();
					break;
				case ShapeType.LShape:
					shape = new LShape();
					break;
				case ShapeType.TShape:
					shape = new TShape();
					break;
				case ShapeType.SquareShape:
					shape = new SquareShape();
					break;
				case ShapeType.ZShape:
					shape = new ZShape();
					break;
			}
			return shape;
		}
	}
}

Kaynak:Kaan Aslan Hocanın Dersinde Tuttuğum Ders Notlarıdır.


So, what do you think ?