معرفی ویژگی وراثت (Inheritance) در ASP.NET AJAX
  در این مقاله روش های مختلف وراثت و ارتباط بین کلاس های والد و فرزند را در ASP.NET AJAX مورد بررسی قرار خواهم داد.
   Ajax
   ۳۸۵۳۱
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۸۷/۵/۲۶
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

تذکر :

مخاطبین اصلی این مقاله، افراد متوسط و پیشرفته در زمینه Javascript و Ajax در نظر گرفته شده اند.

مقدمه :

یکی از مهمترین و جالبترین ویژگی های موجود در زبان های شی گرا، ویژگی وراثت (Inheritance) می باشد.

در زبان های شی گرا از قبیل #C و JAVA و VB.NET خاصیت وراثت مبتنی بر کلاس ها (Class Based) می باشد. یعنی شما می توانید کلاس هایی بسازید که تمامی اعضایی که به صورت Public یا Protected در کلاس والد (Parent) می باشند را به ارث برده و مورد استفاده قرار دهند. به این کلاس ها، کلاس های فرزند(Child) گویند.

ولی در زبان جاوا اسکریپت سناریو به شکل متفاوتی است زیرا در این زبان در حقیقت کلاس وجود ندارد و کلاس به صورت شبیه سازی شده وجود دارد و وراثت به شکل مبتنی بر prototype یعنی prototype-based می باشد. و تمامی خصوصیات و متدها از آبجکت prototype به ارث می روند.

شروع :

ادامه مقاله را با طرح یک مثال ادامه می دهم.

فرض کنید کلاسی به نام حیوان خانگی (Pet) داریم و قصد داریم کلاسی به نام گربه (Cat) بنویسیم که از کلاس حیوان خانگی وراثت بگیرد و اعمال متداول را انجام دهد.

در این مقاله، خاصیت وراثت را ابتدا با استفاده از جاوا اسکریپ محض انجام خواهیم داد و سپس با استفاده از ASP.NET AJAX.

کلاس حیوان خانگی را به شکل زیر در نظر می گیریم.


Pet = function() {
   this._name="";
   this._age=0;
}
Pet.prototype =
function() {
   speak:
function() {
      throw Error("This method should be overridden by derived classes.");
   }
}

در قطعه کد بالا ما کلاسی به نام Pet تعریف کرده ایم که دارای دو خصوصیت برای نگهداری نام و سن حیوان، می باشد و دارای یک متد به نام speak می باشد که پیاده سازی نشده است. و اگر این متد فراخوانی شود، خطایی تولید می شود و بیانگر این می باشد که این متد باید توسط کلاس فرزند override شود.

اکنون قصد داریم کلاسی به نام گربه بنویسیم که از کلاس بالا وراثت گرفته و متد speak را override نموده و صدای گربه را بر می گرداند.


Cat = function() {
   //Call base class’s constructor
   Pet.call(this);
}

//Inherit properties defined in prototype
Cat.prototype = new Pet();
//Override speak method
Cat.prototype.speak = function() {
   return 'Meeeooow'
}

در قطعه کد بالا آبجکت Cat از Pet وراثت گرفته است و سه عمل دیگر صورت گرفته است .

  1. به ارث بردن خصوصیات تعریف شده در سازنده (Constructor) کلاس والد، به وسیله فراخوانی نمودن سازنده کلاس Pet در سازنده کلاس Cat
  2. به ارث بردن خصوصیات تعریف شده در قسمت prototype کلاس والد.  این عمل توسط ایجاد یک نمونه جدید از کلاس Pet و نسبت دادن آن به prototype کلاس Cat به وجود آمده است.
  3. override نمودن متد speak

قطعه کد بالا به شکل زیر قابل استفاده می باشد.


var cat = new Cat();
cat.speak();

پیاده سازی وراثت توسط ASP.NET AJAX :

اکنون اعمالی را که توسط جاوا اسکریپت محض  انجام دادیم را با استفاده از ASP.NET AJAX به شکل حرفه ای تری انجام خواهیم داد.

ابتدا کلاس Pet را می نویسیم


Type.registerNamespace('Samples')
Samples.Pet =
function() {
   this._name = '';
   this._age = 0;
}
Samples.Pet.prototype =
 {
   speak:
function() {
   throw Error("This method should be overridden by derived classes.");
   }
}
Type.registerClass(
'Samples.Pet');

نکته قابل توجه در قطعه کد بالا این است که ما این کلاس را در یک فضای نامی به نام Samples قرار داده ایم.

اکنون کلاسی به نام Cat در یک فضای نامی به نام Samples ایجاد خواهیم نمود و از کلاس Pet وراثت خواهیم گرفت.


Type.registerNamespace('Samples');
Samples.Cat =
function() {
   Samples.Cat.initializeBase(
this);
}
Sapmples.Cat.prototype = {
speak:
function() {
   return 'Meeeooow';
   }
}
Type.registerClass(
'Samples.Cat', Samples.Pet);

در قطع کد بالا ما در سازنده کلاس Cat با استفاده از متد initializeBase و ارسال this به عنوان پارامتر برای آن، کلیه خواص موجود در سازند کلاس والد یعنی Pet را به ارث برده ایم.

سپس متد speak را override نموده ایم. در انتهای قطعه کد، کلاس را رجیستر نموده ایم. 

تذکر :

دقت داشته باشید که باید کلاس والد را به عنوان پارامتر دوم به متد registerClass ارسال کنیم.

خوب، فرض کنید که سازنده کلاس والد تعدادی پارامتر را به عنوان آرگومان دریافت می نماید. پس سازنده کلاس والد، یعنی Pet را به شکل زیر تغییر می دهیم.


Samples.Pet = function(name, age) {
   this._name = name;
   this._age = age;
}

در قطعه کد زیر در سازنده کلاس Cat ،  ما پارامترها را دریافت نموده و به سازند کلاس والد یعنی Pet می فرستیم.


Samples.Cat = function(name, age) {
   Samples.Cat.initializeBase(
this, [name, age]);
}

همانطور که ملاحظه می نمایید، پارامترهای لازم را به شکل یک آرایه (Array) در پارامتر دوم تابع initializeBase ارسال نموده ایم.

قطعه کد فوق به شکل زیر قابل استفاده است.


var cat=new Cat('CatName',1)

اکنون فرض کنید که در متدی که override نموده ایم، قصد داریم متد مربوطه در کلاس والد را فرخوانی نماییم.

این عمل به شکل زیر قابل انجام است.


Samples.Cat.prototype = function() {
   Samples.Cat.callBaseMethod(
this, 'speak');
}

در قطعه کد بالا با استفاده از متد callBaseMethod این عمل انجام شده است. پارامتر اول this و پارامتر دوم نام متد مربوطه می باشد.

در صورتی که متد کلاس والد دارای پارامتر باشد، باید پارامتر ها را به شکل یک آرایه و به عنوان پارامتر سوم به متد callBaseMethod ارسال نماییم.


Samples.Cat.callBaseMethod(this, 'speak',[param1,param2,....] );

موفق باشید.