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

تعداد بازدید ها : 1,503 بازدید
 شی گرایی در دارت

دارت نیز همانند تمام زبان های سطح بالا از شی گرایی پشتیبانی کامل می کند . با فرض اینکه شما به مباحث شی گرایی آشنایی کامل دارید ، در قطعه کد زیر پایه ای ترین مباحث شی گرایی ( یعنی ارث بری ) قابل مشاهده است :

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’ به قبل از نام کتاب اضافه شده است .

می خوانم   ویجت PopupMenuButton

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

امیدوارم که این مطلب برای شما مفید باشد . در صورت تمایل می توانید به سایت مرجع دارت نیز در این آدرس مراجعه و اطلاعات بیشتری کسب نمایید .

1+
محمدمجتبی جوارشکیان

محمدمجتبی جوارشکیان

من محمدمجتبی جوارشکیان ، کارشناس IT و فعال اجتماعی هستم و در حوزه معماری ، طراحی ، تحلیل گری ، مدلسازی و توسعه ی محیط های نرم افزاری فعالیت دارم . بسیار خوشحال می شوم من را از انتقادات ، پیشنهادات و نظرات خود مطلع فرمایید . آدرس ایمیل : info@javareshkian.ir

ارسال یک پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پانزده − هشت =