علاقمندان به زبان های برنامه نویسی روزتون بخیر. با آموزش زبان برنامه نویسی پاسکال (Pascal) از وب سایت آموزشی پی وی لرن همراهتون خواهیم بود. در بخش قبل مبحث شی گرایی در زبان پاسکال (Pascal) را آغاز نمودیم. در این بخش نیز این مبحث را با موضوع قابلیت نظارت اعضای Object در پاسکال و Constructors و Destructors ادامه خواهیم داد
در ابتدا برای یادآوری مطالب قبل به مثالی توجه نمایید.
در زیر یک مثال کامل برای نشان دادن چگونگی استفاده از اشیاء در Pascal آورده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | <span class="pln">program exObjects</span><span class="pun">;</span><span class="pln"> type </span><span class="typ">Rectangle</span> <span class="pun">=</span> <span class="kwd">object</span> <span class="kwd">private</span><span class="pln"> length</span><span class="pun">,</span><span class="pln"> width</span><span class="pun">:</span><span class="pln"> integer</span><span class="pun">;</span> <span class="kwd">public</span><span class="pln"> procedure setlength</span><span class="pun">(</span><span class="pln">l</span><span class="pun">:</span><span class="pln"> integer</span><span class="pun">);</span> <span class="kwd">function</span><span class="pln"> getlength</span><span class="pun">():</span><span class="pln"> integer</span><span class="pun">;</span><span class="pln"> procedure setwidth</span><span class="pun">(</span><span class="pln">w</span><span class="pun">:</span><span class="pln"> integer</span><span class="pun">);</span> <span class="kwd">function</span><span class="pln"> getwidth</span><span class="pun">():</span><span class="pln"> integer</span><span class="pun">;</span><span class="pln"> procedure draw</span><span class="pun">;</span> <span class="kwd">end</span><span class="pun">;</span> <span class="kwd">var</span><span class="pln"> r1</span><span class="pun">:</span> <span class="typ">Rectangle</span><span class="pun">;</span><span class="pln"> pr1</span><span class="pun">:</span> <span class="pun">^</span><span class="typ">Rectangle</span><span class="pun">;</span><span class="pln"> procedure </span><span class="typ">Rectangle</span><span class="pun">.</span><span class="pln">setlength</span><span class="pun">(</span><span class="pln">l</span><span class="pun">:</span><span class="pln"> integer</span><span class="pun">);</span> <span class="kwd">begin</span><span class="pln"> length </span><span class="pun">:=</span><span class="pln"> l</span><span class="pun">;</span> <span class="kwd">end</span><span class="pun">;</span><span class="pln"> procedure </span><span class="typ">Rectangle</span><span class="pun">.</span><span class="pln">setwidth</span><span class="pun">(</span><span class="pln">w</span><span class="pun">:</span><span class="pln"> integer</span><span class="pun">);</span> <span class="kwd">begin</span><span class="pln"> width </span><span class="pun">:=</span><span class="pln">w</span><span class="pun">;</span> <span class="kwd">end</span><span class="pun">;</span> <span class="kwd">function</span> <span class="typ">Rectangle</span><span class="pun">.</span><span class="pln">getlength</span><span class="pun">():</span><span class="pln"> integer</span><span class="pun">;</span> <span class="kwd">begin</span><span class="pln"> getlength </span><span class="pun">:=</span><span class="pln"> length</span><span class="pun">;</span> <span class="kwd">end</span><span class="pun">;</span> <span class="kwd">function</span> <span class="typ">Rectangle</span><span class="pun">.</span><span class="pln">getwidth</span><span class="pun">():</span><span class="pln"> integer</span><span class="pun">;</span> <span class="kwd">begin</span><span class="pln"> getwidth </span><span class="pun">:=</span><span class="pln"> width</span><span class="pun">;</span> <span class="kwd">end</span><span class="pun">;</span><span class="pln"> procedure </span><span class="typ">Rectangle</span><span class="pun">.</span><span class="pln">draw</span><span class="pun">;</span> <span class="kwd">var</span><span class="pln"> i</span><span class="pun">,</span><span class="pln"> j</span><span class="pun">:</span><span class="pln"> integer</span><span class="pun">;</span> <span class="kwd">begin</span> <span class="kwd">for</span><span class="pln"> i</span><span class="pun">:=</span> <span class="lit">1</span><span class="pln"> to length </span><span class="kwd">do</span> <span class="kwd">begin</span> <span class="kwd">for</span><span class="pln"> j</span><span class="pun">:=</span> <span class="lit">1</span><span class="pln"> to width </span><span class="kwd">do</span><span class="pln"> write</span><span class="pun">(</span><span class="str">' * '</span><span class="pun">);</span><span class="pln"> writeln</span><span class="pun">;</span> <span class="kwd">end</span><span class="pun">;</span> <span class="kwd">end</span><span class="pun">;</span> <span class="kwd">begin</span><span class="pln"> r1</span><span class="pun">.</span><span class="pln">setlength</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln"> r1</span><span class="pun">.</span><span class="pln">setwidth</span><span class="pun">(</span><span class="lit">7</span><span class="pun">);</span><span class="pln"> writeln</span><span class="pun">(</span><span class="str">'Draw a rectangle:'</span><span class="pun">,</span><span class="pln"> r1</span><span class="pun">.</span><span class="pln">getlength</span><span class="pun">(),</span> <span class="str">' by '</span> <span class="pun">,</span><span class="pln"> r1</span><span class="pun">.</span><span class="pln">getwidth</span><span class="pun">());</span><span class="pln"> r1</span><span class="pun">.</span><span class="pln">draw</span><span class="pun">;</span> <span class="kwd">new</span><span class="pun">(</span><span class="pln">pr1</span><span class="pun">);</span><span class="pln"> pr1</span><span class="pun">^.</span><span class="pln">setlength</span><span class="pun">(</span><span class="lit">5</span><span class="pun">);</span><span class="pln"> pr1</span><span class="pun">^.</span><span class="pln">setwidth</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span><span class="pln"> writeln</span><span class="pun">(</span><span class="str">'Draw a rectangle:'</span><span class="pun">,</span><span class="pln"> pr1</span><span class="pun">^.</span><span class="pln">getlength</span><span class="pun">(),</span> <span class="str">' by '</span> <span class="pun">,</span><span class="pln">pr1</span><span class="pun">^.</span><span class="pln">getwidth</span><span class="pun">());</span><span class="pln"> pr1</span><span class="pun">^.</span><span class="pln">draw</span><span class="pun">;</span><span class="pln"> dispose</span><span class="pun">(</span><span class="pln">pr1</span><span class="pun">);</span> <span class="kwd">end</span><span class="pun">.</span> |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 3 4 5 6 7 8 9 10 | Draw a rectangle: 3 by 7 * * * * * * * * * * * * * * * * * * * * * Draw a rectangle: 5 by 4 * * * * * * * * * * * * * * * * * * * * |
قابلیت دید قابلیت دسترسی اعضای شی را نشان می دهد. اعضای شیء پاسکال سه نوع visibility دارند.
ردیف | Visibility و دسترسی |
---|---|
۱ | Public اعضا می توانند توسط واحدهای دیگر خارج از واحد برنامه مورد استفاده قرار گیرند. |
۲ | Private اعضا فقط در واحد فعلی قابل دسترسی هستند. |
۳ | Protected اعضا فقط در مورد اشیاء پیاده شده از object والدین در دسترس هستند. |
به طور پیش فرض ، فیلدها و متدهای یک object عمومی هستند و به خارج از واحد فعلی صادر می شوند.
سازندگان (Constructors) نوع خاصی از متدها هستند که هر زمان که یک شی ایجاد شود به طور خودکار فراخوانده می شوند. شما فقط با اعلام یک متد با کلید واژه constructor ، در Pascal یک سازنده ایجاد می کنید. معمولاً ، نام متد Init است ، با این وجود می توانید هر شناسه معتبر خود را ارائه دهید. می توانید به همان اندازه آرگومان های مورد نظر خود را به تابع constructor منتقل کنید.
تخریب کننده ها (Destructors) روش هایی هستند که در هنگام تخریب جسم فرا خوانده می شوند. روش های destructor هرگونه تخصیص حافظه ایجاد شده توسط سازندگان را از بین می برد.
مثال زیر یک constructor و یک destructor برای کلاس Rectangle ارائه می دهد که طول و عرض را برای مستطیل در زمان ایجاد شیء مقدار دهی می کند و هنگامی که از محدوده خارج می شود آن را خراب می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | program exObjects; type Rectangle = object private length, width: integer; public constructor init(l, w: integer); destructor done; procedure setlength(l: integer); function getlength(): integer; procedure setwidth(w: integer); function getwidth(): integer; procedure draw; end; var r1: Rectangle; pr1: ^Rectangle; constructor Rectangle.init(l, w: integer); begin length := l; width := w; end; destructor Rectangle.done; begin writeln(' Desctructor Called'); end; procedure Rectangle.setlength(l: integer); begin length := l; end; procedure Rectangle.setwidth(w: integer); begin width :=w; end; function Rectangle.getlength(): integer; begin getlength := length; end; function Rectangle.getwidth(): integer; begin getwidth := width; end; procedure Rectangle.draw; var i, j: integer; begin for i:= 1 to length do begin for j:= 1 to width do write(' * '); writeln; end; end; begin r1.init(3, 7); writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth()); r1.draw; new(pr1, init(5, 4)); writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth()); pr1^.draw; pr1^.init(7, 9); writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth()); pr1^.draw; dispose(pr1); r1.done; end. |
هنگامی که کد فوق کامپایل و اجرا می شود، نتیجه ی زیر را ایجاد می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Draw a rectangle: 3 by 7 * * * * * * * * * * * * * * * * * * * * * Draw a rectangle: 5 by 4 * * * * * * * * * * * * * * * * * * * * Draw a rectangle: 7 by 9 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Destructor Called |
در این بخش از مباحث شی گرایی در زبان پاسکال (Pascal) به موضوع قابلیت نظارت اعضای Object در پاسکال به همراه Constructors و Destructors پرداختیم. در جلسه ی آینده مبحث را با وراثت برای Pascal Objects ادامه خواهیم داد. با ادامه ی آموزش ها از وب سایت آموزشی پی وی لرن همراه باشید.