دنیای برنامه نویسی از خیلی از جهات شبیه به دنیای واقعی است. اگر بحث شی گرایی در آموزش برنامه نویسی را بدانید، متوجه این موضوع که گفتم خواهید شد. قبل از شروع حرف زدن در رابطه با abstract، اجازه بدهید یک تعریف ساده از برنامه نویسی شی گرا داشته باشیم.
در برنامه نویسی شی گرا هر چیزی که ساخته میشود یک نمونه شی از نمونه اولیه است به طوری که از آن نمونه اولیه ارث بری خواهد کرد. خب، این داستان چه کمکی به جامعه برنامه نویسی میکند؟ داستان شی گرایی کمکهای زیادی به برنامه نویسان کرده که چند نمونه از آنها را مثال میزنم. جلوگیری از پیچیده شدن کدها، جلوگیری از تکرار بی رویه کدها و خیلی موارد دیگر که بشدت برنامه نویسی شی گرا را محبوب ساخته است. خب حال که یک دید کلی نسبت به برنامه نویسی شی گرا پیدا کردید، وقت آن است که به سراغ داستان abstract class برویم.
abstract (ابسترکت) چیست؟
برای تعریف این مفهوم، ابتدا میخواهم شما را با مفهوم abstract در دنیای واقعی آشنا کنم و برای این کار یک مثال از دنیای واقعی برای شما آورده ام. در بعضی از کارها، موقعیتهایی به وجود میآید که ما برای ایجاد تغییرات کوچک، کارهای تکراری انجام دهیم و این کارهای تکراری شاید بارها و بارها تکرار شود که اعلاوه بر ایجاد هزینه زمانی باعث ایجاد هزینه مالی هم خواهد شد. یک کارخانه دفتر سازی را در نظر بگیرید که همه دفترها به یک شکل تولید میکند و فقط در تعداد خطهای آنها متفاوت هستند. یعنی بعضی از دفترها یک خطی، بعضی دو خطی، بعضی سه خطی و بعضی دیگر بدون خط هستند. یک روش غیرمعقول این است که برای هر نوع دفتر یک خط تولید جداگانه در نظر بگیریم، که اصلا منطقی به نظر نمیرسد. روش دیگر این است که تا مرحله درج خطوط دفتر از یک خط تولید مشترک استفاده شود و در پایان هر دفتر به بخش تولید خط مربوطه هدایت شود.
بعد از مدتی یک جلد جدید به دفتر اضافه میشود و باید از هر دو نوع جلد تولید شود که مانند دفتر قبلی دارای یک خطی، دو خطی، سه خطی و بی خط است. باز باید مراحل دفتر با جلد قبلی تکرار شود که این نیز معقول نیست. خب چکار باید کرد؟ در اینجاست که مفهوم abstract به میان میآید. یک خط تولید برای یک Template اصلی دفتر به وجود میآوریم و بقیه دفترها از آن ارث بری خواهند کرد. در این حالت ما باز اگر چندها نوع جلد دفتر دیگر هم داشته باشیم از تکرار داستان خط تولید پرهیز کرده ایم.
در تصویر زیر مثال بالا را برایتان به تصویر کشیدهایم:
خب این داستان Abstract ها در دنیای واقعی بود که با مثال برای شما توضیح دادیم، حال با استفاده از یک مثال واقعی در دنیای برنامه نویسی آن را برای شما توضیح میدهم. میخواهیم همین مثال را به کدهای برنامه نویسی تبدیل کنیم.
همانطور که در زیر میبینید ما یک کلاس با عنوان notebook_cover_Bold (دفترچه با جلد ضخیم) رو داریم که روند تولید آن به شکل زیر است.
class noteBook_cover_Bold {
public function make() {
return $this
->none_line()
->one_line()
->two_line()
->three_line();
}
protected function none_line() {
// create none line note book cover bold
}
protected function one_line() {
// create one line note book cover bold
}
protected function two_line() {
// create two line note book cover bold
}
protected function three_line() {
// create three line note book cover bold
}
}
$noteBook_cover_Bold = new noteBook_cover_Bold();
$noteBook_cover_Bold->make();
حال اگر بخواهیم همان دفترچه را با جلد نازک (notebook_cover_Thin) تولید کنیم باید کا مراحل یالا را تکرار کنیم ولی ما گفتیم که نمیخواهیم با تکرار کد مواجه شویم، در اینجا با استفاده از مفهوم Abstract این داستان تکرار را از میان برمیداریم.
abstract class noteBook {
public function make() {
return $this
->none_line()
->one_line()
->two_line()
->three_line();
}
protected function none_line() {
// create none line note book cover bold
}
protected function one_line() {
// create one line note book cover bold
}
protected abstract function two_line();
protected abstract function three_line();
}
class noteBook_cover_Bold extends noteBook {
protected function three_line() {
// create three line note book cover bold
}
}
class noteBook_cover_Thin extends noteBook {
protected function two_line() {
// create two line note book cover bold
}
}
$noteBook_cover_Bold = new noteBook_cover_Bold();
$noteBook_cover_Bold->make();
خب در بالا یک نمونه کد هم برای شما آوردیم و به شکل عملی شما را با Abstract آشنا کردیم. حال در ادامه شما را برخی از مزیت های Abstract آشنا میکنم.
مزیتهای Abstract
- کمتر شدن کدهای نوشته شده(البته توجه داشته باشید که در بالا ما فقط یک تکه کد کوتاه را با Abstract نوشتیم وشاید تفاوت حجم کد آنچانی را شاهد نباشید اما در پروژههای واقعی قطعا حجم زیادی از کدهای شما کاسته خواهد شد)
- افزایش سرعت برنامه
- خواناتر شدن کدهای نوشته شده
در ادامه چند نکته مهم در رابطه با کلاسهای Abstract را میگوییم
- کلاسهایی که با Abstract نوشته میشوند میتوانند ادغامی از متدهای معمولی و متدهای Abstract باشد.
- کلاس های Abstract با کلمه کلیدی Extends ارث بری خواهند داشت.
نمونه کلاس Abstract در جاوا
در مثال زیر طریقه استفاده از کلاس Abstract در زبان برنامه نویسی جاوا را مشاهده میکنید:
// Abstract class
abstract class Animal {
// Abstract method (does not have a body)
public abstract void animalSound();
// Regular method
public void sleep() {
System.out.println("Zzz");
}
}
// Subclass (inherit from Animal)
class Pig extends Animal {
public void animalSound() {
// The body of animalSound() is provided here
System.out.println("The pig says: wee wee");
}
}
class Main {
public static void main(String[] args) {
Pig myPig = new Pig(); // Create a Pig object
myPig.animalSound();
myPig.sleep();
}
}
نمونه کلاس Abstract در C#
در مثال زیر طریقه استفاده از کلاس Abstract در زبان برنامه نویسی سی شارپ را مشاهده میکنید:
// Abstract class
abstract class Animal
{
// Abstract method (does not have a body)
public abstract void animalSound();
// Regular method
public void sleep()
{
Console.WriteLine("Zzz");
}
}
// Derived class (inherit from Animal)
class Pig : Animal
{
public override void animalSound()
{
// The body of animalSound() is provided here
Console.WriteLine("The pig says: wee wee");
}
}
class Program
{
static void Main(string[] args)
{
Pig myPig = new Pig(); // Create a Pig object
myPig.animalSound(); // Call the abstract method
myPig.sleep(); // Call the regular method
}
}