مشاهده

Download Report

Transcript مشاهده

‫به نام خدا‬
‫‪1‬‬
‫فهرست مطالب‬
‫‪2‬‬
‫طراحی و پیاده سازی انواع داده‬
‫جدید‬
‫‪ -1‬مشخص کردن صفات نوع داده یا اطالعاتی که‬
‫باید دراین شی داده ذخیره شود‪(.‬صفات هر شی داده‬
‫معموال در طول عمر آن عوض‬
‫و‬
‫مثل‬
‫نمی شود)‬
‫‪ -2‬تعیین عناصری که شی داده حاوی آن است‪.‬‬
‫‪3‬‬
‫‪‬‬
‫تمام فعالیت های طراحی را می توان به عنوان‬
‫طراحی‬
‫پیاده سازی‬
‫‪ -1‬نمایش خاصی برای اشیاء داده با‬
‫استفاده از انواع داده ای که در‬
‫زبان موجود است یا سایر انواع داده‬
‫انتزاعی‪.‬‬
‫‪ -2‬پیاده سازی عملیات بر روی این‬
‫اشیاء داده به صورت زیربرنامه هایی‬
‫که آرگومان های آنها این اشیاء داده‬
‫هستند‪.‬‬
‫‪4‬‬
‫مثال‪:‬‬
‫برای نوشتن برنامه ثبت نام و‬
‫تنظیم کالس دانشگاه‬
‫شی داده ‪Section :‬‬
‫این شی داده ‪ :‬نام استاد ‪ ،‬شماره‬
‫اتاق ‪ ،‬ظرفیت و‪...‬‬
‫این شی داده ‪ :‬لیستی از‬
‫دانشجویان ثبت نام شده‬
‫‪5‬‬
‫که بر روی این شی داده‬
‫کار می کنند‪ :‬ایجاد ‪ Section‬جدید ‪،‬‬
‫انتساب دانشجو به یک ‪ ، Section‬از بین‬
‫مثال‪:‬‬
‫برای نوشتن برنامه ثبت نام و‬
‫دانشگاه‬
‫تنظیم کالس‬
‫نمایش نام‬
‫‪: Section‬‬
‫استاد به صورت یک رشته ‪ 10‬کاراکتری ‪،‬‬
‫نمایش لیست دانشجویان به صورت یک آرایه‬
‫خطی و‪...‬‬
‫روی ‪ : Section‬زیربرنامه‬
‫هایی که آرگومان های آنها ‪ ،‬این این شی‬
‫داده باشد‪.‬‬
‫‪6‬‬
‫برنامه نویس‬
‫می تواند دقیقا مثل‬
‫نوع داده ی جدیدی است‬
‫که توسط برنامه نویس تعریف می شود وشامل‬
‫موارد زیراست‪:‬‬
‫‪ -1 ‬نوع داده ای که توسط برنامه نویس تعریف‬
‫می شود‪.‬‬
‫‪ -2 ‬مجموعه ای از عملیات انتزاعی بر روی‬
‫اشیایی ازآن نوع‬
‫‪ -3 ‬بسته بندی اشیاء آن نوع ‪ ،‬به طوری که‬
‫کاربر آن نوع نمی تواند آن اشیاء را بدون‬
‫استفاده از این عملیات دستکاری کند‪.‬‬
‫‪7‬‬
‫نمایش حافظه مربوط به مقادیرحقیقی‬
‫و صحیح ‪ ،‬کامال بسته بندی شده است‪ ،‬یعنی از‬
‫برنامه نویس پنهان است ‪.‬برنامه نویس بدون‬
‫اینکه از جزئیات نمایش حافظه این انواع‬
‫اطالع داشته باشد ‪ ،‬از اشیای داده ی آنها‬
‫استفاده می کند‪ .‬فقط نام و عملیاتی را‬
‫برای دستکاری آن نوع فراهم می بیند‪.‬‬
‫‪8‬‬
‫تعریف نوع‪:‬‬
‫‪ ‬مکانیزمی برای توصیف‬
‫داده‬
‫از اشیاء‬
‫تعریف می شود و اعالنی‬
‫درتعریف نوع‬
‫وجود دارد که ساختار دسته ای از اشیای کالس‬
‫را توصیف می کند‪ .‬بدین ترتیب نام نوع به‬
‫عنوان نام دسته ای از اشیاء داده محسوب می‬
‫شود ‪ .‬هر وقت به اشیاء داده ای از آن ساختار‬
‫نیاز باشد ‪ ،‬به جای تکرار توصیف ساختمان‬
‫داده ‪ ،‬کافی است نام نوع ارائه شود‪.‬‬
‫‪9‬‬
‫تعریف نوع ‪ ،‬نوع‬
‫را تعریف نمی کند ‪ ،‬زیرا عملیاتی را بر‬
‫به عنوان مثال‪:‬‬
‫به رکوردهای ‪ B ، A‬و ‪ C‬نیاز باشد ‪ ،‬به طوری که‬
‫ساختار آنها یکسان باشد‪.‬‬
‫تعریف نوع زیر را در نظر بگیرد‪:‬‬
‫‪Type Rational = record‬‬
‫;‪numerator: integer‬‬
‫‪denominator: integer:‬‬
‫‪end‬‬
‫اکنون اعالن زیر را در نظر بگیرید که ‪ B ، A‬و ‪C‬‬
‫را از نوع ‪ Retional‬درنظر می گیرد‪:‬‬
‫;‪var A, B ,c: Retional‬‬
‫تعریف ساختار شی داده ی نوع ‪ ، Retional‬به جای‬
‫اینکه سه بار برای ‪ B ، A‬و ‪ C‬تکرار شود ‪ ،‬فقط‬
‫‪10‬‬
‫ما ‪:‬‬
‫اّ‬
‫‪ ‬اما ساختار داخلی اشیاء داده نوع ‪ ،‬بسته بندی‬
‫هر زیربرنامه ای که می تواند‬
‫شده‬
‫متغیری را از نوع جدید اعالن کند ‪ ،‬اجازه دارد‬
‫داشته‬
‫به هر عنصر از نمایش آن نوع‬
‫باشد‪ .‬چنین زیر برنامه ای می تواند انواع‬
‫تعریف شده بر روی آن اشیای داده را‬
‫و آنها را مستقیما دستکاری کند(به آنها‬
‫دستیابی داشته باشد)‪.‬‬
‫‪ ،‬این‬
‫‪ ‬مفهوم‬
‫دستیابی را غیر ممکن می سازد‪ ،‬به طوری که ‪،‬‬
‫فقط زیربرنامه هایی که به عنوان بخشی از خود‬
‫نوع هستند می دانند اشیای داده آن نوع چگونه‬
‫‪11‬‬
‫‪ ‬مکانیزمهایی را برای‬
‫توصیف می کنیم (مانند پکیج در ادا)‬
‫‪ ‬پکیج در ادا‬
‫‪ ‬این مفهوم را طوری بسط می دهیم که عملیات بر‬
‫قابل‬
‫روی این اشیا داده از طریق‬
‫استفاده باشند‪.‬‬
‫‪12‬‬
‫باید توجه کنیم که ‪:‬‬
‫و‬
‫‪،‬‬
‫‪، SectionType‬‬
‫را تعریف می کند که توسط رویه هایی که‬
‫در پکیج های دیگری اعالن شده اند‪ ،‬قابل مشاهده اند‪.‬‬
‫برای ‪ Section‬نشان می دهد که ساختار‬
‫‪ ‬اعالن‬
‫توسط زیربرنامه هایی‬
‫داخلی اشیاء داده ‪Section‬‬
‫که از پکیچ استفاده می کنند قابل دستیابی باشد‪.‬‬
‫جزئیات واقعی نوع ‪ ، Section‬در انتهای پکیج‬
‫آمده است‪.‬‬
‫دربخش‬
‫‪13‬‬
SectionType ‫مشخصات پکیج‬

Package SectionType is

type StudentID is integer;

type Section(MaxSize : integer) is private;

procedure AssignStudent(Sect: in out section; Stud in StudentID);



procedure CreateSection(Sect: in out section; Instr in integer; Room in
integer) ;
private
type Section(MaxSize : integer) is
record


Room: integer;

instructor: integer;

ClassSize: integer range 0 .. MaxSize := 0;

Classroll: array (1 .. MaxSize) of StudentID;
end record;


end;
14
‫مثال‪:‬‬
‫می‬
‫و‬
‫‪ ‬رویه های‬
‫دستیابی داشته باشند‬
‫توانند به آرایه‬
‫که عضوی از ‪ Section‬است‪ ،‬اما هر رویه دیگری که‬
‫در خارج از پکیج قرار دارد نمی توانند به این‬
‫آرایه دسترسی داشته باشد‪.‬حتی اگر متغیری از‬
‫نوع ‪ Section‬را تعریف کرده باشند‪.‬‬
‫‪15‬‬
‫توجه داشته باشیم که‪:‬‬
‫پیاده سازی رویه های‬
‫‪ ‬در بخش‬
‫اعالن شده در بخش مشخصات پکیج ‪ ،‬قرار دارد‪.‬‬
‫می تواند اشیاء داده و‬
‫‪ ‬بخش‬
‫انواعی داشته باشد که توسط پکیچ های دیگر‬
‫قابل مشاهده نباشد‪.‬‬
‫رویه ‪ ScheduleRoom‬فقط می تواند در‬
‫‪ AssignStudent‬و ‪ createSection‬فراخوانی شود‪ .‬این‬
‫نام درخارج از این پکیج ناشناخته است‪.‬‬
‫‪16‬‬
‫‪16‬‬
SectionType ‫پیاده سازی پکیج‬


Package body SectionType is
procedure AssignStudent(…) is
- statements to insert student on ClassRoll

end;


procedure CreateSection(…) is
- Statements to initialize components of record

end;


procedure ScheduleRoom(…) is
- Statements to schedule section in a room

end;


end;
17
‫خوب حاال یه سؤال ؟؟؟‬
‫در تعریف پکیج‬
‫‪ ‬به نظر شما چرا از بخش‬
‫باال استفاده شد تا اطالعات موجود در آن فقط‬
‫توسط بدنه پکیج مورد استفاده قرار گیرد؟ آیا‬
‫نمی شد جزئیات نمایش در پکیج دیگری باشد و‬
‫دراین پکیج اشاره گری به آن قرار داده می‬
‫شد؟ چه مشکلی پیش می آمد؟‬
‫را برای پیاده‬
‫‪ ‬برای جواب به این سوال‬
‫سازی اشیاء داده ی بسته بندی شده معرفی می‬
‫کنیم‪:‬‬
‫‪18‬‬
‫بسته بندی غیرمستقیم‬
‫نوع داده انتزاعی به‬
‫دراین حالت ‪،‬‬
‫وسیله مشخصات پکیج ‪ A‬تعریف شده است‪.‬‬
‫برای شی ‪ P‬در رکورد فعالیت پکیج ‪A‬‬
‫نگهداری می شود‪ .‬در پکیج ‪ ، B‬که شی ‪ P‬را‬
‫و استفاده می کند ‪ ،‬رکورد فعالیت باید‬
‫اشاره گری به حافظه داده ی واقعی داشته‬
‫رکورد‬
‫رکورد‬
‫باشد‪.‬‬
‫فعالیت‬
‫فعالیت‬
‫پکیج ‪B‬‬
‫‪P‬‬
‫‪19‬‬
‫پکیج ‪A‬‬
‫معایب بسته بندی غیرمستقیم‬
‫‪ ‬دستیابی به ‪ P‬تاوان اجرایی دارد‪ .‬هر‬
‫دستیابی به ‪ P‬مستلزم دستیابی غیرمستقیم‬
‫به اشاره گر است تا حافظه واقعی پیدا‬
‫شود‪ .‬استفاده مکرر از ‪ P‬ممکن است گران‬
‫تمام شود‪.‬‬
‫‪20‬‬
‫بسته بندی مستقیم‪:‬‬
‫همانند حالت غیر مستقیم ‪ ،‬ساختار شی داده ی‬
‫انتزاعی توسط مشخصات پکیج ‪ A‬تعریف شده است‪.‬‬
‫دراین حالت ‪ ،‬حافظه واقعی ‪ P‬در رکورد فعالیت‬
‫پکیج ‪ B‬نگهداری می شود‪.‬‬
‫رکورد‬
‫فعالیت‬
‫پکیج ‪B‬‬
‫‪21‬‬
‫رکورد‬
‫فعالیت‬
‫پکیج ‪A‬‬
‫ویژگی بسته بندی مستقیم‪:‬‬
‫‪ ‬اگر نمایش شی انتزاعی عوض شود ‪ ،‬تمام نمونه‬
‫های آن (مثال پکیچ ‪ )B‬نیز باید‬
‫کامپایل شوند‪ .‬این کار ‪ ،‬تغییرات در سیستم‬
‫را در زمان کامپایل کردن ‪ ،‬گران می کند ‪،‬‬
‫اما کارایی اجرای آن‬
‫‪22‬‬
‫استفاده می کند تا‬
‫‪ ‬ادا از مدل‬
‫را افزایش دهد‪ .‬پس استفاده از شی‬
‫داده انتزاعی مستلزم جزئیات نمایش شی است‪.‬‬
‫بنابراین ‪ ،‬نیاز به بخش ‪ Private‬در مشخصات پکیج‬
‫است‪.‬‬
‫‪23‬‬
‫‪ ‬وقتی نیاز به تعریف انواع مشابهی باشد ‪ ،‬زبان‬
‫ممکن است پارامتری کردن تعریف نوع را تدارک‬
‫ببیند‪.‬در این حالت شکلهای گوناگونی از‬
‫پارامترها استفاده می شوند‪.‬‬
‫برای ‪ Section‬اجازه می دهد که‬
‫تعریف نوع دارای پارامتر ‪ MaxSize‬باشد که حداکثر‬
‫ظرفیت کالس را تعیین می کند ‪:‬‬
‫‪Type Section(MaxSize: integer) is‬‬
‫‪record‬‬
‫;‪Room: integer‬‬
‫‪Instructor: integer:‬‬
‫;‪ClassSize: integer range 0 .. MaxSize‬‬
‫;‪ClassRoll:array(1 .. MaxSize) of Student_ID‬‬
‫‪24‬‬
‫اعالن متغیرهای زیر را درنظربگیرید‪:‬‬
‫;‪end record‬‬
‫انواع داده انتزاعی کلی‬
‫‪25‬‬
...‫انواع داده انتزاعی کلی‬
‫ تعریف نوع‬، ‫پکیج ادا که در زیر آمده‬
‫کلی را برای نوع پشته کلی نشان می دهد که در‬
‫که در پشته ذخیره می شود‬
، ‫آن‬
‫ به عنوان پارامتر تعریف‬،
:‫شده اند‬
Generic
type Elem is private;
Package AnyStackType is
type Stack(Size:Psitive) is private;
procedure Push(I: in Elem; S: in out Stack);
procedure Pop(I: out Elem; S: in out Stack);
Private
type Stack(Size: Positive) is record
StkStorage: array(1 .. Size) of Elem;
Top: integer range 0 … Size := 0;
end record;
26
‫نمونه سازی از نوع انتزاعی کلی‬
‫‪ ‬تعریف پکیج کلی ‪ ،‬قالبی (‪ )template‬را نشان می‬
‫دهد که می تواند برای ایجاد انواع داده‬
‫انتزاعی خاص مورد استفاده قرار گیرد‪.‬‬
‫‪ ‬فرایند ایجاد نوع خاص از روی الگوی تعریف کلی‬
‫‪ ،‬نمونه سازی)‪ (instantiation‬نام دارد‪.‬‬
‫‪27‬‬
‫پیاده سازی نوع داده انتزاعی‬
‫کلی‪:‬‬
‫‪28‬‬
29
‫وراثت و کالس ها‬
‫‪30‬‬
‫‪ ‬وراثت یگانه ‪ :‬کالس فقط یک پدر دارد‪.‬‬
‫‪ ‬وراثت چندگانه ‪ :‬کالس بتواند چند پدر‬
‫داشته باشد‪.‬‬
‫‪V‬‬
‫‪31‬‬
‫‪A‬‬
‫‪U‬‬
‫‪X‬‬
‫‪W‬‬
‫وراثت چندگانه‬
‫برای‪X‬‬
‫‪Y‬‬
‫‪C‬‬
‫‪B‬‬
‫‪D‬‬
‫وراثت یگانه‬
‫کالس و بسته بندی‬
‫‪ ‬راستی یادتون باشه‪ :‬در ‪ C++‬وراثت چندگانه‬
‫وجود دارد ولی در جاوا ممکن نیست‪.‬‬
‫‪ ‬کالس ها در زبانهایی مثل ‪ C++‬و اسمالتاک و‬
‫جاوا با بسته بندی ارتباط تنگاتنگی دارند‪.‬‬
‫یعنی کالس ها معموال بخشی دارندکه توسط کالس‬
‫دیگربه ارث برده می شود و بخش دیگری دارند که‬
‫مخفی است‪.‬‬
‫‪32‬‬
‫کالس و بسته بندی‬
‫مثال (‪ )C++‬در کالس زیر‪( :‬اسامی بعد از ‪public‬‬
‫درخارج ازکالس قابل استفاده و قابل ارث بری‬
‫هستند)‬
‫(اعالن های ‪ size‬و ‪ storage‬که بعد از ‪ private‬آمده‬
‫اند ‪،‬فقط در داخل کالس قابل دستیابی اند)‬
‫{ ‪Class intstack‬‬
‫‪public:‬‬
‫};‪intstack() { size = 0‬‬
‫} ;‪void push(int i) { size = size + 1; storage[size] = I‬‬
‫… ‪int pop‬‬
‫‪Private:‬‬
‫;‪int size‬‬
‫‪33‬‬
‫;)‪int storage(100‬‬
‫}‬
‫هر انتزاع شامل توصیفگر داده ها و‬
‫توابعی است که بر روی اشیایی از آن نوع عمل‬
‫نام دارند‪.‬‬
‫می کنند‪ .‬این توابع‬
‫تابعی که همنام کالس است و‬
‫هنگام ایجاد شی از آن کالس‪ ،‬فراخوانی می‬
‫شود‪.‬‬
‫تابعی همنام با کالس (که در ‪ c++‬با‬
‫نام دارد‪ .‬این‬
‫~ شروع می شود) ‪،‬‬
‫تابع هنگام از بین رفتن شیئی از آن کالس‬
‫فراخوانی می شود‪.‬‬
‫‪34‬‬
‫ و جاوا از طریق کالس های‬C++ ‫ وراثت در‬
Class elem {
.‫مشتق انجام می شود‬
Public:
elem() { v = 0; }
void ToElem(int b) { v = b; }
int fromElem().{ return v; }
Private:
int v; }
‫ شی داده نوع‬elem ‫کالس‬
ElemStack ‫ و کالس‬elem
‫پشته هایی از اشیا آن‬
‫نوع ایجاد می کند‬
Class ElemStack: elem {
public:
ElemStack() { size = 0;}
void push(elem i)
{ size = size + 1; storage[size] = i; }
elem pop()
{ size = size - 1;return Storage[size + 1] }
Private:
int size;
elem storage[100];
35
}
‫پیاده سازی کالس ها‬
‫‪ ‬در کالس مشتق ‪ ،‬فقط اسامی ارثی ‪ ،‬از کالس پایه‬
‫به فضای نام محلی کالس مشتق اضافه می شود و‬
‫اسامی عمومی برای کاربران آن کالس قابل مشاهده‬
‫اند‪.‬‬
‫‪ ‬نمایش حافظه واقعی برای اشیای تعریف شده ‪ ،‬می‬
‫تواند به طور ایستا ‪ ،‬توسط اعالن داده ها در‬
‫تعریف کالس تعیین شود‪.‬‬
‫‪ ‬هر نمونه ای از کالس ‪ ،‬حافظه داده ی مخصوص به‬
‫خود را دارد که شامل داده ها و اشاره گرهایی‬
‫به متدهای کالس است ‪.‬از این رو دو مدل پیاده‬
‫سازی برای کالس ها داریم‪:‬‬
‫‪ -1‬روش کپی‬
‫‪36‬‬
‫‪ -2‬روش اشتراک حافظه‬
‫پیاده سازی کالس ها‬
‫در این مدل هر نمونه ای از کالس‬
‫به خود را دارد‬
‫مشتق‪،‬‬
‫به متدهای‬
‫و‬
‫که شامل‬
‫کالس پایه نیز هست‪ .‬اگر شیئی از کالس پایه ای‬
‫مشتق شود ‪ ،‬این وراثت توسط مترجم اداره می‬
‫شود و حافظه واقعی آن شی‬
‫آن است‪.‬‬
‫‪c++‬‬
‫فقط از روش کپی‬
‫استفاده می کند‪.‬‬
‫در این روش همه اشیاء‬
‫از کالس مشتق ‪ ،‬از حافظه کالس پایه استفاده‬
‫‪37‬‬
‫وراثت متدها‬
‫‪ ‬وراثت متدها برای ایجاد اشیای جدید ‪ ،‬قدرت دیگری‬
‫اعمال می کند که در بسته بندی موجود نیست‪.‬‬
‫مثال قبل را بسط می دهیم و‬
‫زیربرنامه عمومی ‪ MyType‬را به کالس ‪ ElemStack‬اضافه‬
‫می کنیم که نام نوع را چاپ می کند‪’’ I am type :‬‬
‫’’‪.ElemStack‬‬
‫})”‪Void MyType() {printf(“I am type ElemStack \ n‬‬
‫اگر فرض کنیم نیاز به کالس جدیدی به نام ‪NewStack‬‬
‫است تا مانند ‪ ElemStack‬رفتار کند ‪ ،‬اما شامل متد‬
‫جدید ‪ peek‬باشد که عنصرباالی پشته را برمی گرداند و‬
‫پشته را نیز تغییر نمی دهد‪ .‬می توان به جای تعریف‬
‫مجدد کالس ‪ NewStack‬از وراثت استفاده کرد‪:‬‬
‫‪38‬‬
‫{ ‪Class NewStack: ElemStack‬‬
‫‪Public:‬‬
‫آیا متد ارثی مشکل درست می کند؟‬
‫‪ ‬برای اشیاء کالس ‪ ، NewStack‬متد ‪ MyType‬پیام ‪’’ I‬‬
‫’’‪ am type ElemStack‬را چاپ می کند‪ ،‬زیرا تعریف‬
‫متدارثی ازکالس ‪ elemstack‬است‪ .‬این مشکل را به‬
‫دو طریق می توان حل کرد‪:‬‬
‫‪ .1‬می توانیم متد ‪ MyType‬را در تعریف کالس‬
‫‪ NewStack‬دوباره تعریف کنیم‪:‬‬
‫})”‪Void MyType() {printf(“I am type NewStack \ n‬‬
‫‪ .2‬از تابع مجازی )‪ (virtual‬استفاده شود‪.‬‬
‫‪39‬‬
‫تابع مجازی‪:‬‬
‫‪‬‬
‫كالس پایه مي تواند متدهایي داشته باشدكه همنام آن ها‬
‫در كالس هاي مشتق نیز موجود باشد‪ .‬این متد را در كالس‬
‫پایه متد مجازي مي گوییم‪.‬‬
‫در تعریف کالس ‪ ، ElemStack‬زیربرنامه ‪ MyType‬را به صورت زیر تعریف می کنیم‪:‬‬
‫کالس پایه‬
‫برای‬
‫‪NewStack‬‬
‫})” ‪Virtual void TypeName() {printf(“ElemStack \ n‬‬
‫}))(‪Void MyType() {printf(“ I am type”, TypeName‬‬
‫زمانی که فراخوانی می شود به‬
‫زیربرنامه ای مقید می شود که در‬
‫زمان تعریف متد به آن مراجعه می‬
‫شود‪.‬‬
‫و در کالس ‪ NewStack‬می توانیم ‪ TypeName‬را به صورت زیر تعریف می کنیم‪:‬‬
‫‪40‬‬
‫})” ‪Virtual void TypeName() {printf(“NewStack \ n‬‬
‫به جای تکرار متد ‪MyType‬‬
‫کالس های انتزاعی‬
‫‪ ‬اگر قرار باشد از تعریف کالس ها به صورت یک‬
‫قالب استفاده کنیم به طوری که کالس های دیگری‬
‫از آن ساخته شوند از دو روش استفاده می کنیم‪:‬‬
‫باید کالس را طوری تغییر دهیم‬
‫که دیگر نتوان از آن مستقیم شیی ساخت و اشیایی‬
‫که از این کالس استفاده می کنند باید از زیرکالس‬
‫مشتق شوند‪.‬‬
‫در‪ C++‬این کار را با اعالن‬
‫‪ TypeName‬به صورت تابع مجازی تهی انجام می‬
‫دهیم‪:‬‬
‫‪41‬‬
‫;‪Virtual void TypeName() = 0‬‬
‫‪‬‬
‫کالس های انتزاعی‬
‫شکل دیگری از وراثت که درآن تفاوت‬
‫بین کالس پایه و مشتق جدید را تعریف می کنیم‪.‬‬
‫‪ ‬برای این کار یک کالس ‪ delta‬تعریف می کنیم که شامل‬
‫تغییرات باشد‪.‬‬
‫کالس ‪ ElemStack‬و کالس مشتق ‪ NewStack‬را در نظر‬
‫بگیرد‪:‬‬
‫{ ‪Deltaclass StackMod‬‬
‫};)(‪Int peek() { return storage[size].FromElem‬‬
‫سپس کالس جدید خود را می توانیم به صورت زیر ایجاد‬
‫کنیم‪:‬‬
‫تمام صفات ‪ ElemStack‬را با‬
‫‪StackMod‬‬
‫توسط کالس‬
‫تغییراتی که‬
‫‪Class NewStack‬‬
‫‪= class ElemStack‬‬
‫‪+ deltaclass‬‬
‫‪StackMode‬‬
‫‪42‬‬
‫اعمال شد به ارث می برد‪.‬‬
‫مفاهیم انتزاع‬
‫‪ ‬وراثت و انتزاع مکانیزمی برای انتقال اطالعات‬
‫بین اشیاء کالس های مربوط ارائه می کند‪.‬‬
‫‪ ‬اگر ‪ A=> B‬به معنای این باشد که ‪ B‬به ‪ A‬ربط‬
‫دارد ‪ ،‬چهار نوع رابطه بین اشیاء ‪ A‬و ‪ B‬وجود‬
‫دارد‪:‬‬
‫‪ ‬اختصاصی شدن )‪ : (specialization‬متداول ترین شکل‬
‫‪ B composite‬خواص‬
‫وراثت است که اجازه می دهد شیء مشتق‬
‫دقیقتری نسبت به آنچه که در ‪ A‬وجود دارد کسب‬
‫کند‪.‬‬
‫‪stack‬‬
‫‪record‬‬
‫‪43‬‬
‫‪…….‬‬
‫‪Real stack‬‬
‫‪int stack‬‬
‫مفاهیم انتزاع‪...‬‬
‫‪ :‬اصل تفکیک انتزاع‬
‫به عناصرآن است‪.‬‬
‫پشته از دیدگاه خارجی‬
‫متشکل از متغیر ‪ top‬و ازدیدگاه داخلی متشکل‬
‫از ]‪ storage[100‬است که اسامی داخلی درخارج‬
‫‪stack‬‬
‫از تعریف کالس ناشناخته اند‪.‬‬
‫]‪Stotage[100‬‬
‫‪44‬‬
‫‪top‬‬
‫مفاهیم انتزاع‪...‬‬
‫فرآیند ایجاد نمونه‬
‫ای ازکالس است‪ .‬درواقع عملیات کپی است‪.‬‬
‫کالس دربرنامه ‪ C++‬است‪.‬‬
‫اعالن نمونه هایی از شیء‬
‫‪stack‬‬
‫‪Stack C‬‬
‫‪45‬‬
‫‪Stack B‬‬
‫;‪Stack A, B, C‬‬
‫‪Stack A‬‬
‫مفهوم متضاد آن دسته بندی است‪ .‬مثال ما می توانیم ‪A‬‬
‫‪ B ،‬و ‪ C‬را به عنوان نمونه هایی از کالس ‪ stack‬دسته‬
‫بندی کنیم‪.‬‬
‫مفاهیم انتزاع‪...‬‬
‫در این حالت‬
‫‪ ،‬اشیای مشابه ‪ ،‬برای اهداف مشترکی دریک‬
‫گروه قرار می گیرند‪.‬‬
‫مترجم ‪،‬‬
‫باشد‪.‬‬
‫ممکن است بین پشته ها دریک‬
‫وجود داشته‬
‫یا‬
‫فعالیت را به صورت پشته‬
‫رکوردهای‬
‫پاسکال‬
‫و‬
‫‪C‬‬
‫‪stack‬‬
‫پیاده سازی می کنند اما نقش رکورد فعالیت‬
‫ساختارهای آنها یکسان‬
‫‪Symbol‬گرچه‬
‫درآنها متفاوت‪table‬است‪.‬‬
‫‪act record‬‬
‫است‪.‬‬
‫‪46‬‬
‫‪Pascal act record‬‬
‫‪c act record‬‬
‫به معنای این است که نام یک‬
‫زیربرنامه یا عملگر بر حسب انواع آرگومان ها و‬
‫نتایج ‪ ،‬به هر تعدادی از تعریف توابع اشاره‬
‫کند‪.‬‬
‫به توابعی اعمال می شود که آرگومان‬
‫آنها میتواند خود یک نوع باشد‪ .‬به عبارتی نوع‬
‫آرگومان تابع چندریختی می تواند یکی از چند‬
‫نوع باشد‪.‬‬
‫عملگر ‪ +‬هم براي جمع كردن اعداد‬
‫اعشاري و هم براي جمع كردن اعداد صحیح به كار‬
‫مي رود‪.‬‬
‫‪47‬‬


‫ را به صورت یك كالس قالب اعالن‬vector ‫ كالس‬: ‫مثال‬
‫كردیم و برداري از آن ساختیم تا حدود آن كنترل‬
#include "iostream.h"
:‫شود‬
#include "conio.h"

#include "stdlib.h"

template <class T>

class vector

{

T *x;

int low, high;



public:
vector (int l, int h)
{

low = l;

high = h;

x = new T[high – low + 1];

}
48
‫پیاده سازی توابع چندریختی‬
‫مثل ام ال یا‬
‫‪ ‬برای زبان هایی با‬
‫‪ ، C++‬چندریختی پیچیدگی جدیدی را ایجاد نمی‬
‫کند‪.‬‬
‫اما زبان هایی که چندریختی پویا را اجازه می‬
‫منجر به مشکل می شود ‪ ،‬زیرا‬
‫دهند‬
‫آرگومان تابع چندریختی باید درحین اجرای‬
‫برنامه تعیین شود‪.‬‬
‫‪49‬‬
‫با تشکر صمیمانه از صبر و حوصله‬
‫همه شما‬
‫‪50‬‬
51