با عرض سلام خدمت کاربران محترم سایت پی وی لرن.
با جلسه ای دیگر از سری جلسات دوره آموزش زبان برنامه نویسی دارت Dart در خدمت شما هستیم.
در این جلسه قصد داریم به آموزش شئ گرایی در زبان دارت از جمله کلاس ها در زبان دارت و همچنین اشیا در زبان دارت بپردازیم.
همانطور که قبلا نیز گفتیم، دارت یک زبان شئ گرا (OOP) است.
شئ گرایی (Object Oriented) یک شیوه برنامه نویسی است.
در این شیوه به همه چیز در برنامه نویسی مانند اشیا دنیای واقعی نگاه میشود. یک شئ در دنیای واقعی و برنامه نویسی، دارای مقادیر (Instance Variable) و رفتار هایی (Methods) میباشد.
اشیا از روی یک الگو و یا قالب به نام کلاس (Class) ساخته میشوند.
از کلمه کلیدی class برای ساخت کلاس استفاده میکنیم.
بدین صورت که ابتدا کلمه کلیدی class و سپس نام کلاس را مینویسیم. بدنه کلاس را نیز با {} مشخص میکنیم.
گرامر:
1 2 3 4 5 6 | class class_name { //<fields> //<getters/setters> //<constructors> //<functions> } |
یک کلاس و به دنبال آن یک شئ شامل اجزاء زیر هستند:
مثال:
1 2 3 4 5 6 7 8 9 | class Car { // instance variable String engine = "E1001"; // method void disp() { print(engine); } } |
برای ساخت شئ از روی یک کلاس، از کلمه کلیدی new استفاده میکنیم.
گرامر:
1 | var object_name = new class_name([ arguments ]) |
سمت راست عبارت، متد ازنده کلاس را فراخوانی میکند و باید پارامترهای لازم را مقدار دهی کنیم.
مثال:
1 | var obj = new Car("Engine 1") |
برای دسترسی به اعضای اشیا مانند متغیر ها و توابع آن، از نقطه . استفاده میکنیم.
گرامر:
1 2 3 4 5 | //accessing an attribute onject_name.field_name //accessing a function object_name.function_name() |
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 | void main() { Car c= new Car(); c.disp(); } class Car { // field String engine = "E1001"; // function void disp() { print(engine); } } |
خروجی:
1 | E1001 |
از توابع سازنده برای مقداردهی اولیه متغیر های کلاس یا شئ استفاده میشود.
نام سازنده باید با نام کلاس یکی بوده و هیچ مقدار را نمیتواند برگشت دهد.
تمامی کلاس ها در زبان دارت یک سازنده پیشفرض دارند.
گرامر:
1 2 3 | Class_name(parameter_list) { //constructor body } |
مثال:
1 2 3 4 5 6 7 8 | void main() { Car c = new Car('E1001'); } class Car { Car(String engine) { print(engine); } } |
خروجی:
1 | E1001 |
با استفاده از سازنده های نام گذاری شده میتوانیم بیش از یک سازنده در کلاس داشته باشیم.
گرامر:
1 | Class_name.constructor_name(param_list) |
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 | void main() { Car c1 = new Car.namedConst('E1001'); Car c2 = new Car(); } class Car { Car() { print("Non-parameterized constructor invoked"); } Car.namedConst(String engine) { print("The engine is : ${engine}"); } } |
خروجی:
1 2 | The engine is : E1001 Non-parameterized constructor invoked |
از کلمه کلیدی this برای ارجاع به شئ جاری استفاده میشود. از این کلمه برای جلوگیری از ابهام هنگام کار با متغیر ها و یا توابع شئ یا کلاس استفاده میشود.
مثال:
1 2 3 4 5 6 7 8 9 10 | void main() { Car c1 = new Car('E1001'); } class Car { String engine; Car(String engine) { this.engine = engine; print("The engine is : ${engine}"); } } |
خروجی:
1 | The engine is : E1001 |
با استفاده از توابع getter و setter میتوانیم به متغیر های یک شئ دسترسی پیدا کنیم.
به صورت مستقیم نیز میشود به متغیر های یک شئ دسترسی داشت اما این کار باعث استاندار سازی بیشتر کد میشود.
Getter ها مقدار یک متغیر را برمیگردانند و Setter ها مقدار یک متغیر را تنظیم میکنند.
گرامر getter:
1 2 3 | Return_type get identifier { } |
گرامر setter:
1 2 3 | set identifier(value) { } |
مثال:
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 | class Student { String name; int age; String get stud_name { return name; } void set stud_name(String name) { this.name = name; } void set stud_age(int age) { if(age<= 0) { print("Age should be greater than 5"); } else { this.age = age; } } int get stud_age { return age; } } void main() { Student s1 = new Student(); s1.stud_name = 'MARK'; s1.stud_age = 0; print(s1.stud_name); print(s1.stud_age); } |
خروجی:
1 2 3 | Age should be greater than 5 MARK Null |
جلسه آموزش شئ گرایی در زبان دارت و کلاس ها در زبان دارت و همچنین اشیا در زبان دارت نیز به پایان رسید.
در جلسه بعد به آموزش وراثت در زبان دارت که مبحثی دیگر در شئ گرایی در زبان دارت است، خواهیم پرداخت.
زهرا
واقعا ممنون خیلی سااااده و مفید توضیح دادین. مطالبتونم کامله خیلی کمک کردین
حمید
سلام
ممنون از آموزش تون
ولی فکر کنم مثال آخر برای getter و setter مشکل داره و مفهوم رو منتقل نمیکنه لطفا مجددا بررسی بفرمایید
صادق
سلام.
فکر نمی کنم مثال از نظر مفهومی مشکل داشته باشه. شاید از ای نظر عجیب باشه که استفاده از setter و getter در زبان دارت با بقیه زبان ها کمی فرق می کنه. مثلا در سایر زبان ها ما خود تابع رو فراخوانی می کنیم اما اینجا با تابع مثل یک متغیر رفتار می کنیم و حتی () هم جلوی اون نمی ذاریم. مثلا به جای s1.set_name(“aaa”) می نویسیم “s1.set_name = “aaa