شی گرایی در دارت

دارت نیز همانند تمام زبان های سطح بالا از شی گرایی پشتیبانی کامل می کند . با فرض اینکه شما به مباحث شی گرایی آشنایی کامل دارید ، در قطعه کد زیر پایه ای ترین مباحث شی گرایی ( یعنی ارث بری ) قابل مشاهده است :
- 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 پاس می دهد . در مثال فوق چون سازنده کلاس والد دو مقدار ورودی دریافت می کرده است ، مقدار دوم (قیمت کتاب) به صورت دستی مقدار دهی شده است .
امیدوارم که این مطلب برای شما مفید باشد . در صورت تمایل می توانید به سایت مرجع دارت نیز در این آدرس مراجعه و اطلاعات بیشتری کسب نمایید .