شی گرایی در دارت
دارت نیز همانند تمام زبان های سطح بالا از شی گرایی پشتیبانی کامل می کند . با فرض اینکه شما به مباحث شی گرایی آشنایی کامل دارید ، در قطعه کد زیر پایه ای ترین مباحث شی گرایی ( یعنی ارث بری ) قابل مشاهده است :
void main() { var newbook = new DartBook(); newbook.setprice(500); newbook.settitel('basic Dart'); newbook.setpublisher('Dart.dev'); print('titel : ' + newbook.gettitel()); } class Book { int price; String titel; setprice(price) {this.price = price;} getprice() {return this.price;} settitel(titel) {this.titel = titel;} gettitel() {return this.titel;} } class DartBook extends Book { String publisher; setpublisher(publisher) {this.publisher = publisher;} getpublisher() {return this.publisher;} }
در خط ۱۰ کلاسی به نام Book تعریف شده است که مقادیر نام کتاب و قیمت کتاب را در خود نگهداری می کند ، این کلاس توابعی جهت ثبت قیمت و نام کتاب و دریافت قیمت و نام کتاب دارد .
در خط ۲۱ نیز کلاسی به نام DartBook از کلاس Book ارث بری (extends) کرده است و فقط نام ناشر را نگهداری می کند . این کلاس نام کتاب و قیمت کتاب را از کلاس والد خود ( کلاس Book ) به ارث برده است و نیازی به تعریف مجدد ندارد .
در خط ۲ نیز آبجکتی از نوع کلاس DartBook ایجاد شده است و در خط های ۳ تا ۵ نیز به این آبجکت مقدار دهی شده است .
بازنویسی (override) توابع کلاس والد
در بعضی مواقع نیاز می شود ، توابع کلاس والد را در کلاس فرزند بازنویسی کنیم ، این کار معمولا زمانی نیاز می شود که باید کارکرد آن تابع در کلاس والد را تغییر دهید . به عنوان مثال اگر مایل باشیم قبل از نام کتاب در مثال فوق ، موضوع کتاب نیز درج گردد ، می توانیم تابع settitel را override کرده و موضوع کتاب را نیز قبل از نام کتاب قرار دهیم . به قطعه کد زیر که روش override تابع settitel را در کلاس DartBook نمایش می دهد دقت نمایید :
class DartBook extends Book { String publisher; setpublisher(publisher) { this.publisher = publisher; } getpublisher() { return this.publisher; } @override settitel(titel) { this.titel = 'Dart/' + titel; } }
همانطور که در خط ۱۳ قطعه کد بالا نیز قابل مشاهده است ، برای override یک تابع از کلاس والد ، فقط کافیست که تابعی با همان نام و با همان ورودی تعریف نموده و در بدند کد تابع ، دستورات جدیدی را که مد نظر داریم درج نمایید . در این مثال عبارت ‘/Dart’ به قبل از نام کتاب اضافه شده است .
دسترسی به تابع اصلی از کلاس والد پس از override کردن تابع
در صورتی که پس از override کردن تابع ، نیاز شد به تابع اصلی از کلاس والد دسترسی داشته باشیم فقط کافیست با کلمه کلید super نام تابع را فراخوانی کنیم . این عمل به کامپایلر دارت اعلام می کند که منظور ما تابع اصلی از کلاس والد است نه تابعی که ما در داخل کلاس جاری بازنویسی (override) کرده ایم .
class DartBook extends Book { String publisher; setpublisher(publisher) { this.publisher = publisher; } getpublisher() { return this.publisher; } @override settitel(titel) { this.titel = 'Dart/' + titel; } settitelParent(titel){ super.settitel(titel); } }
در مثال بالا در خط ۱۷ تابع جدیدی تعریف کرده ایم که در بدنه تابع با استفاده از دستور super به تابع بازنویسی نشده ی settitel از کلاس والد دسترسی دارد .
همچین هر زمان تصمیم داشته باشید از داخل کلاس فرزند ، سازنده کلاس والد را فراخوانی نمایید ، باید از super استفاده نمایید .
DartBook(titel): super(titel, 500);
در قطعه کد بالا برای کلاس DartBook یک سازنده تعریف شده است که در ورودی عنوان کتاب را دریافت می کند و این مقدار را به سازنده کلاس والد (Book) توسط دستور super پاس می دهد . در مثال فوق چون سازنده کلاس والد دو مقدار ورودی دریافت می کرده است ، مقدار دوم (قیمت کتاب) به صورت دستی مقدار دهی شده است .
امیدوارم که این مطلب برای شما مفید باشد . در صورت تمایل می توانید به سایت مرجع دارت نیز در این آدرس مراجعه و اطلاعات بیشتری کسب نمایید .