آبجیکٹ اورینٹڈ پروگرامنگ (object oriented programming)

نبیل

تکنیکی معاون
اس مضمون پر تبصرہ جات کے لیے اس ربط پر جائیں

تعارف

زیر نظر مضمون میں آبجیکٹ اورینٹڈ پروگرامنگ سے متعلق بنیادی معلومات فراہم کی جائیں گی اور اس کے ساتھ ساتھ وضاحت کے لیے کچھ سورس کوڈ بھی فراہم کیا جائے گا۔ آبجیکٹ اوینٹڈ پروگرامنگ، پروگرامنگ کے اس طریقے کا نام ہے جس کی بنیاد آبجیکٹس کے تصور پر رکھی گئی ہے۔ وہ پروگرامنگ کی زبانیں جن میں آبجیکٹ اورینٹڈ پروگرامنگ کی سپورٹ موجود ہوتی ہے، انہیں آجبیکٹ اوینٹڈ پروگرامنگ لینگویجز کہا جاتا ہے۔ اس کی مثال جاوا، سی پلس پلس اور سی شارپ وغیرہ ہیں جو کہ کمپائل کی جاتی ہیں۔ دوسری جانب سکرپٹنگ کی کئی زبانیں بھی آبجیکٹ اورینٹڈ پروگرامنگ کو سپورٹ کرتی ہیں جیسے کہ پائتھون، جاوا سکرپٹ، روبی اور پرل وغیرہ۔ اس مضمون میں پیش کیا گیا کوڈ جاوا پروگرامنگ زبان میں لکھا گیا ہے۔ پروگرامنگ کی اصطلاح میں آبجیکٹ ایسی ڈیٹا ٹائپ ہے جس میں ڈیٹا اور اس ڈیٹا پر عملیات کرنے والا کوڈ اکٹھے (encapsulate) کیے جاتے ہیں۔ یوں آبجیکٹس کسی بھی حقیقی دنیا کے تصور کو ڈیٹا اور کوڈ میں ماڈل کر سکتے ہیں۔ مثال کے طور پر ایک شکل (Figure) کارتیسی نظام (Cartesian System) کے کسی ایک پوائنٹ پر موجود ہوتی ہے اور اسے ڈرا کرنے کا کوئی ایک خاص طریقہ ہوتا ہے۔ اسے کوڈ کی شکل میں ذیل کے طریقے سے پیش کیا جا سکتا ہے:

کوڈ:
class Figure
{
	// data members
	int x_coordinate;
	int y_coordinate;
	
	// function members or methods
	function Figure()
	{
		x_coordinate= 0;
		y_coordinate= 0;
	}
	
	function Draw(intx, int y)
	{
		// actual implementation
		...
	}
}
بنیادی تصورات

کلاس (class)

بالا میں ایک Figure آبجیکٹ ٹائپ ڈکلیر کی گئی ہے جس کے لیے class کلیدی لفظ (key-word) استعمال کیا گیا ہے۔ اس طرز کی ڈیٹا ٹائپ جس میں اصل آبجیکٹس کریٹ یا تخلیق (instantiate) کرنے کا سانچہ (templtate) موجود ہوتا ہے، انہیں کلاس (class) کہا جاتا ہے۔ اتفاق سے تقریباً تمام آبجیکٹ اورینٹڈ پروگرامنگ لینگویجز میں کلاس ڈکلیر کرنے کے لیے class کی ورڈ ہی استعمال کیا جاتا ہے۔ بالا کی مثال میں قابل غور بات اس میں موجود ڈیٹا اور کوڈ کو یکجا کرنا ہے۔ کسی کلاس یا آبجیکٹ کے ڈیٹا ایلیمنٹس (عناصر) کو اس کے ڈیٹا ممبر کہا جاتا ہے جبکہ اس کے فنکشنز کو اس کے کوڈ ممبر یا میتھڈ (method) کہا جاتا ہے۔

آبجیکٹ (object)

جیسا کہ اوپر وضاحت کی جا چکی ہے کہ کسی آبجیکٹ کو کریٹ (create) کرنے کے لیے اس کی کلاس ڈیفنیشن کا استعمال کیا جاتا ہے۔ مثال کے طور پر ذیل میں دو Figure ٹائپ کے آبجیکٹ ڈکلیر کیے گئے ہیں:

کوڈ:
Figure figure1= new Figure();
Figure figure2= new Figure();

یہاں new کی ورڈ کا استعمال نوٹ کریں۔ جاوا اور دوسری کئی پروگرامنگ لینگویجز میں new کے استعمال کے بعد ہی کسی آبجیکٹ کے لیے میموری میں جگہ بنائی جاتی ہے جسے میموری ایلوکیشن (memory allocation) بھی کہا جاتا ہے۔ بالا کی مثال سے دیکھا جا سکتا ہے کہ کس طرح ایک کلاس ڈیفینیشن کو استعمال کرکے آبجیکٹس تخیلق کیے جا رہے ہیں۔ آبجیکٹس کریٹ کرنے کے بعد ان کے ڈیٹا اور کوڈ ممبرز کو استعمال کیا جا سکتا ہے۔ جاوا میں کسی آبجیکٹ کے کوڈ یا ڈیٹا ممبر تک رسائی حاصل کرنے کے لیے اس آبجیکٹ کے نام کے بعد ایک نقطہ یا ڈاٹ (dot) لکھا جاتا ہے اور اس کے بعد مطلوبہ کوڈ یا ڈیٹا ممبر کا نام لکھا جاتا ہے۔ آبجیکٹس کے ڈیٹا اور کوڈ ممبرز تک رسائی کے اس طریقے کو سکوپ ریزلیوشن (scope resolution) بھی کہا جاتا ہے۔ مثال کے طور پر ذیل کی مثال میں figure1 آبجیکٹ کے کوآرڈینیٹس سیٹ کیے جا رہے ہیں:

کوڈ:
figure1.x_coordinate=10;
figure1.y_coordinate=20;

جبکہ ذیل کی مثال میں figure2 کے Draw میتھڈ کو کال کیا جا رہا ہے:

کوڈ:
figure2.Draw(40, 50);
 

نبیل

تکنیکی معاون
آبجیکٹس میں انفارمیشن کو پوشیدہ رکھنا (Information hiding)

آبجیکٹ اورینٹڈ پروگرامنگ کی ایک بڑی خصوصیت آبجیکٹس میں صرف اس کے پبلک انٹرفیس کو ظاہر کرنا اور اس کی اندرونی تفصیلات کو خفیہ رکھنا ہے۔ آبجیکٹ اورینٹڈ لینگویجز کے سنٹکس (syntax) میں اس مقصد کے لیے باقاعدہ گنجائش رکھی جاتی ہے۔ مثال کے طور پر ذیل میں Figure کلاس کی ڈکلیریشن کو دوبارہ ملاحظہ کریں:

کوڈ:
class Figure
{
// data members
	private int x_coordinate;
	private int y_coordinate;
	
	
	// function members or methods
	public void function Figure()
	{
		x_coordinate= 0;
		y_coordinate= 0;
	}
	
	
	public void function Draw(intx, int y)
	{
		// actual implementation
		...
	}
}

نوٹ کریں کہ اس مرتبہ کلیدی الفاظ public اور private کا استعمال کیا گیا ہے۔ Figure کلاس کے پرائیویٹ سیکشن میں اس کے ڈیٹا ممبر شامل ہیں جبکہ اس کے پبلک سیکشن میں اس کے میتھڈ شامل ہیں۔ عمومی طور پر آبجیکٹ‌ اورینٹڈ پروگرامنگ کا سٹائل یہی ہے کہ آبجیکٹس کے ڈیٹا ممبرز کو پرائیویٹ‌ رکھا جاتا ہے، جبکہ ان کا پبلک انٹرفیس فنکشنز پر مشتمل ہوتا ہے۔ ڈیٹا ممبرز کو پرائیویٹ سیکشن میں رکھنے کے بعد اب ذیل کے انداز میں یہ ان ڈیٹا ممبرز تک رسائی حاصل نہیں کی جا سکتی:

کوڈ:
figure1.x_coordinate=10; //Error: private data member
figure1.y_coordinate=20; //Error: private data member
اس کی بجائے Figure کلاس میں ذیل کے مطابق کوآرڈینیٹس سیٹ کرنے کے لیے مزید میتھڈ شامل کیے گئے ہیں جوکہ بالواسطہ یہی کام سرانجام دیں گے:

کوڈ:
class Figure
{

	// data members
	private int x_coordinate;
	private int y_coordinate;
	
	
	// function members or methods
	public void function Figure()
	{
		x_coordinate= 0;
		y_coordinate= 0;
	}
	
	
	public void function Draw(intx, int y)
	{
		// actual implementation
		...
	}
	
	public void setx(int x)
	{
		x_coordinate= x;
	}
	
	public int getx()
	{
		return x_coordinate;
	}
	
	public void sety(int y)
	{
		y_coordinate= y;
	}
	
	public int gety()
	{
		return y_coordinate;
	}
}

فنکشنز setx اور sety کوآرڈینیٹس سیٹ کرنے کے لیے، جبکہ فنکشنز getx اور gety ان کوآرڈینیٹس کی ویلیو معلوم کرنے کے لیے متعارف کیے گئے ہیں۔ نوٹ کریں کہ کسی کلاس کے پبلک فنکشن خود اسی کلاس کے پرائیویٹ ڈیٹا ممبران تک رسائی (access) رکھتے ہیں جبکہ اس کلاس کے یوزرز کو ان پرائیویٹ ڈیٹا ممبرز تک رسائی حاصل نہیں ہے۔ ان فنکشز کو متعارف کروانے کے بعد اب ذیل کے انداز میں figure1 آبجیکٹ کے کوآرڈینیٹس سیٹ کیے جا سکتے ہیں:

کوڈ:
figure1.setx(10);
figure1.sety(20);

آبجیکٹس کی اندرونی تفصیلات کو پرائیویٹ رکھنا اور صرف آبجیکٹ کے پبلک انٹرفیس کو ظاہر کرنا آبجیکٹ اورینٹڈ ڈیزائن کا بنیادی اصول ہے۔
 

نبیل

تکنیکی معاون
موروثیت (Inheritance)

موروثیت کا شمار آبجیکٹ‌اورینٹڈ پروگرامنگ کے اہم ترین تصورات میں ہوتا ہے۔ تمام آبجیکٹ‌ اورینٹڈ لینگویجز میں اس بات کی گنجائش موجود ہوتی ہے کہ کسی موجودہ کلاس ڈیفینیشن پر مبنی ایک اور کلاس ڈیفائن کی جائے۔ کسی کلاس ڈیفینیشن پر مبنی اس طرز کی نئی کلاسوں کو ڈیرائیوڈ (derived) یا (سب) کلاسز کہا جاتا ہے جبکہ جس کلاس ڈیفینیشن پر ان کی بنیاد رکھی جاتی ہے، اسے ان کی پیرنٹ (یا سپر) کلاس کہا جاتا ہے۔ ایک سب کلاس میں اپنی سپر یا پیرنٹ کلاس کی تمام خصوصیات موجود ہوتی ہیں، یعنی کہ سب کلاس میں وہ تمام ڈیٹا ممبرز اور میتھڈ شامل ہوتے ہیں جو کہ اس کی پیرنٹ کلاس میں موجود ہوتے ہیں۔ موروثیت کی وضاحت کے لیے ہم ایک مرتبہ پھر سے Figure کلاس کا استعمال کرتے ہیں۔ Figure ایک جنرل کلاس ہے جس میں بذات خود کوئی functionality نہیں ہے اور یہ صرف کسی شکل کی پوزیشن کی انفارمیشن کی حامل ہے۔ اب ہم ایک مستطیل (Rectangle) کو بطور آبجیکٹ ماڈل کرنا چاہتے ہیں۔ اس کے لیے ہم ذیل کے انداز میں کلاس Figure سے ایک نئی کلاس Rectangle ڈیرائیو کرتے ہیں:

کوڈ:
class Rectangle extends Figure
{
	private int width;
	private int height;
	
	public Rectangle()
	{
		...
	}	
}

یہاں extends کی ورڈ کا استعمال کیا گیا ہے جو کہ جاوا پروگرامنگ لینگویج میں استعمال کیا جاتا ہے۔ دوسری پروگرامنگ لینگویجز میں سب کلاس ڈیرائیو کرنے کے لیے مختلف انداز استعمال کیا جاتا ہے۔ مثال کے طور پر سی پلس پلس اور سی شارپ میں پیرنٹ کلاس کا نام کولون ":" کے بعد لکھا جاتا ہے۔ یہاں زیادہ اہم بات نوٹ کرنے کی یہ ہے کہ Rectangle کلاس میں اس کی پیرنٹ کلاس Figure سے کارتیسی نظام کے کوآرڈینیٹس اور دوسرے میتھڈ مل گئے ہیں۔ لہذا Rectangle ٹائپ آبجیکٹس کے کوآرڈنیٹس اسی طرح سیٹ کیے جا سکتے ہیں جس طرح Figure ٹائپ آبجیکٹس کے کوآرڈینیٹس سیٹ کیے جا سکتے ہیں۔ مثال کے طور پر ذیل میں ایک Rectangle ٹائپ آبجیکٹ rect1 کریٹ کیا گیا ہے اور اس کے کوآرڈینیٹس سیٹ کیے گئے ہیں:

کوڈ:
Rectangle rect1= new Rectangle(); // instantiate new Rectangle type object
rect1.setx(100); // set x-coordinate
rect1.sety(150); // set y-coordiante

اب ہم Figure کلاس سے ایک اور Circle کلاس ٹائپ ڈیرائیو کرتے ہیں۔ ایک Cricle یعنی دائرے کو ڈرا کرنے کے لیے اس کے مرکز کے کوآرڈینیٹس کے علاوہ اس کے رداس (Radius) کا علم ہونا ضروری ہے۔ ذیل میں کلاس Circle کی ڈیفینیشن فراہم کی گئی ہے:

کوڈ:
class Circle extends Figure
{
	private int radius;	
	
	public Circle()
	{
		...
	}	
}



کسی سب کلاس میں پیرنٹ کلاس سے وراثت میں حاصل کردہ ڈیٹا اور کوڈ ممبرز کا سکوپ وہی ہوتا ہے جو کہ اس کی پیرنٹ کلاس میں ہوتا ہے۔ یعنی جو ڈیٹا ممبر اور میتھڈ کسی کلاس میں پرائیویٹ ہوتے ہیں، وہ اس کی سب کلاس میں بھی پرائیویٹ ہی ہوتے ہیں، اور جو ڈیٹا اور کوڈ ممبر کسی کلاس میں پبلک ہوتے ہیں، وہ اس کی سب کلاس میں بھی پبلک ہوتے ہیں۔ البتہ موروثیت (inheritance) کے اس مکینزم میں مخلتف آبجیکٹ اورینٹڈ لینگویجز میں فراہم سہولیات کے اعتبار سے ترمیم کی جا سکتی ہے۔

بالا کی مثالوں میں جس طرح Figure کلاس سے Rectangle اور Circle کلاسز ڈیرائیو کی گئی ہیں، اسے ذیل کی تصویر سے میں ظاہر کیا گیا ہے۔

inheritance.jpg

آبجیکٹس کی موروثیت کی مناسب سے اس تصویر کو کلاسوں کا شجرہ نسب قرار دیا جا سکتا ہے۔ آبجیکٹ اورینٹڈ ڈیزائن کی اصلاح میں اسے inheritance hierarchy کہا جاتا ہے۔ بالا میں دکھائی گئی inheritance hierarchy میں Figure کلاس باقی کلاسوں کی بنیاد فراہم کر رہی ہے۔ ایسی کلاسوں کو جو کسی inheritance hierarchy کی جڑ (رُوٹ) پر موجود ہوں، انہیں بیس کلاس کہا جاتا ہے۔

ملٹیپل اور سنگل انہیریٹنس (Multiple and Single Inheritance)
جاوا میں ایک کلاس سے کئی کلاسیں ڈیرائیو کی جا سکتی ہیں لیکن ایک کلاس صرف کسی ایک دوسری کلاس سے ڈیرائیو ہو سکتی ہے۔ اسے سنگل انہیریٹنس (Single Inheritance) کہا جاتا ہے۔ جاوا سی شارپ میں Single Inheritance ہی کی گنجائش موجود ہے جبکہ سی پلس پلس میں ایک کلاس ایک سے زیادہ کلاسوں سے ڈیرائیو کر سکتی ہے یعنی اس میں Multiple Inheritance ممکن ہے۔
 
Top