شیءگرایی شامل مفاهیم مختلفی است، اما اساس سه مفهوم اصلی آن به شرح زیر است:
کلاس (Class)
کلاس (Class) در شیءگرایی یک الگو یا قالب برای ساختن اشیاء (Objects) است. یک کلاس مشخص میکند که یک شیء چه ویژگیها (متغیرها یا ویژگیهای عضو) و چه رفتارها (متدها یا توابع عضو) را دارا خواهد بود.
به عبارت دیگر، کلاس یک توصیف یا تعریف از یک نوع خاص از اشیاء است. میتوان آن را به عنوان یک نقشه یا نمونهای از یک شیء فرضی در نظر گرفت که ویژگیها و رفتارهای مشخصی را دارد. یک کلاس میتواند شامل متغیرها (ویژگیها) و توابع (متدها) باشد که وظیفه تعریف و مدیریت رفتار اشیاء مرتبط با آن کلاس را دارند.
به طور معمول، کلاسها یک نام دارند تا بتوانیم به آنها ارجاع داشته باشیم و از آنها نمونهها (شیء) ایجاد کنیم. همچنین، کلاسها میتوانند ویژگیها و رفتارهای مشترک را برای گروهی از اشیاء تعریف کنند و در این صورت نمونهها (شیء) از آن کلاسها را میتوان ایجاد کرد.
به عنوان مثال، در یک برنامه مدیریت دانشگاه، میتوانیم یک کلاس به نام "دانشجو" تعریف کنیم. این کلاس شامل ویژگیهایی مانند نام، شماره دانشجویی و رشته تحصیلی میشود و همچنین متدهایی مانند ثبت نام در دروس و دریافت نمرات را داراست. سپس میتوانیم برای هر دانشجوی جدید یک نمونه (شیء) از این کلاس ایجاد کنیم و از ویژگیها و رفتارهای آن استفاده کنیم.
بنابراین، کلاس در شیءگرایی عبارت است از یک توصیف مشخص که تعیین میکند که یک شیء چه ویژگیها و رفتارهایی را دارا خواهد بود و ما میتوانیم بر اساس آن کلاس نمونههایی از اشیاء بسازیم. یک کلاس از اشیا مختلفی به شرح زیر تشکیل میشود:
- فیلدها (Fields): ویژگیها متغیرهایی هستند که درون یک کلاس تعریف میشوند و وضعیت یا ویژگیهای شیء را نشان میدهند. آنها میتوانند عمومی (public)، خصوصی (private) یا محافظت شده (protected) باشند و میتوانند انواع دادهای مختلفی مانند اعداد صحیح، رشتهها و آبجکتها را نگهداری کنند.
- متدها (Methods): متدها عملکرد و رفتار کلاس را تعریف میکنند. آنها برای انجام عملیاتهای مختلف روی شیء استفاده میشوند. متدها میتوانند ورودیها (پارامترها) را دریافت کنند و مقادیری را برگردانند. آنها نیز میتوانند عمومی، خصوصی و محافظت شده باشند و میتوانند بازگشتی (recursive) باشند.
- سازندهها (Constructors): سازندهها متدهایی هستند که برای ایجاد شیء از یک کلاس استفاده میشوند. آنها وظیفه تنظیم و مقداردهی اولیه به ویژگیهای شیء را دارند. در صورتی که سازندهای تعریف نشده باشد، جاوا به طور پیش فرض یک سازنده بدون پارامتر برای کلاس ایجاد خواهد کرد.
- کلاسهای داخلی (Inner Classes): کلاسهای داخلی، کلاسهایی هستند که داخل یک کلاس دیگر تعریف میشوند. آنها به کلاس بیرونی دسترسی کامل دارند و میتوانند به ویژگیها و متدهای آن دسترسی داشته باشند. از کلاسهای داخلی میتوان برای بهبود سازماندهی کد و انجام عملیاتهای مرتبط با کلاس بیرونی استفاده کرد.
- خاصیتها (Properties): خاصیتها نوعی ویژگی هستند که به صورت مستقیم دسترسی به آنها از طریق متدها را فراهم میکنند. آنها روشهای گتر (getter) و ستر (setter) را برای دریافت و تنظیم مقادیر ویژگیها ارائمطابق با معماری شیءگرا در زبان جاوا، کلاسها اجزای زیر را دارا میباشند:
این اجزا به همراه روابط و تعاملات بین کلاسها، امکانات و ویژگیهای بیشتری را در شیءها و برنامههای جاوا فراهم می آورد.
اشیاء (Objects)
اشیاء (Objects) در شیءگرایی نمونههای مشخصی از یک کلاس هستند. هر شیء دارای ویژگیها (متغیرها یا ویژگیهای عضو) و رفتارها (متدها یا توابع عضو) است که توسط کلاس تعریف شدهاند.
به عنوان مثال، فرض کنید یک کلاس به نام "خودرو" داریم. این کلاس شامل ویژگیهایی مانند برند، مدل، سرعت و رنگ است، و همچنین متدهایی مانند راندن، توقف و تعویض رنگ دارد. حالا، اگر یک شیء از این کلاس به اسم "ماشین من" ایجاد کنیم، آن شیء دارای ویژگیها و رفتارهای تعریف شده در کلاس "خودرو" خواهد بود. برای مثال، میتوانیم ویژگیهای "برند" را به "مرسدس بنز"، "مدل" را به "کلاس C" و "رنگ" را به "نقرهای" تنظیم کنیم، و سپس متد "راندن" را فراخوانی کرده و خودرو را در حالت رانندگی قرار دهیم.
بنابراین، اشیاء در شیءگرایی موجودیتهای فعال و قابل تعامل هستند که دارای ویژگیها و رفتارهای مشخصی هستند. آنها میتوانند در برنامهها به عنوان مؤلفههای اصلی استفاده شوند و با همکاری و ارتباط با سایر اشیاء، برنامه کامل را تشکیل میدهند. هر شیء میتواند وضعیت خود را نگهداری کند، رویدادها را ایجاد کند و به رویدادها پاسخ دهد، و با دیگر اشیاء در تعامل باشد تا وظایف و عملکرد مورد نیاز را انجام دهد.
ارثبری (Inheritance)
ارثبری (Inheritance) در شیءگرایییک مکانیزم است که به یک کلاس اجازه میدهد ویژگیها و رفتارهای یک کلاس مادر را به کلاس فرزند ارث ببرد. در واقع، ارثبری به کلاسها امکان میدهد تا ویژگیها و رفتارهای مشترک را به اشکال سلسلهمراتبی بین کلاسها به اشتراک بگذارند.
کلاسی که ویژگیها و رفتارهای مشترک را تعریف میکند، به عنوان کلاس مادر (یا کلاس پایه، کلاس اصلی) شناخته میشود و کلاسی که ویژگیها و رفتارهای مشابه را از یک کلاس مادر به ارث میبرد، به عنوان کلاس فرزند شناخته میشود.
با استفاده از ارثبری، کلاس فرزند میتواند ویژگیها و رفتارهای کلاس مادر را به ارث ببرد و از آنها استفاده کند. همچنین، کلاس فرزند میتواند ویژگیها و رفتارهای اضافی خود را تعریف کند و به کلاس مادر اضافه کند یا آنها را تغییر دهد.
ارثبری به برنامهنویسان امکان میدهد که رابطههای سلسلهمراتبی و ساختار سلسلهمراتبی را بین کلاسها تعریف کنند. این امر از نظر سازماندهی کد، استفاده مجدد و توسعهپذیری برنامه بسیار مفید است. با ارثبری، کدها و منطق برنامه به صورت سلسلهمراتبی تنظیم میشوند و اشکال سلسلهمراتبی را به صورت منطقی و سازمانیافته نمایش میدهند.
به عنوان مثال، فرض کنید یک کلاس به نام "پستاندار" داریم که ویژگیهایی مانند "نوع تنفس" و "تغذیه با شیر" را داراست، و همچنین متدهایی مانند "تغذیه" و "تنفس" دارد. حالا، میتوانیم یک کلاس فرزند به نام "گربه" ایجاد کنیم که از کلاس "پستاندار" بهره میبرد و ویژگیهای اضافی مانند "تعداد پاها" و "نوع خزنده" را تعریف میکند. با ارثبری، کلاس "گربه" ویژگیها و رفتارهای مشترک با کلاس "پستاندار" را به ارث میبرد و میتتواند از آنها استفاده کند، به علاوه میتواند ویژگیها و رفتارهای خود را نیز اضافه یا تغییر دهد. به این ترتیب، با استفاده از ارثبری، میتوانیم ساختار سلسلهمراتبی بین کلاسها را به خوبی نمایش دهیم و رفتارها و ویژگیهای مشترک را به اشتراک بگذاریم.
در ارثبری، کلاس فرزند به طور ضمنی ویژگیها و رفتارهای کلاس مادر را دارا میباشد و میتواند آنها را به صورت مستقیم استفاده کند. اگر در کلاس فرزند بخواهیم ویژگیها را تغییر دهیم یا رفتارها را اصلاح کنیم، میتوانیم آنها را بازنویسی کنیم و به شکل مورد نیاز تغییر دهیم.
به طور خلاصه، ارثبری در شیءگرایی به کلاسها امکان میدهد تا توسعه یابند، رفتارها و ویژگیها را به اشتراک بگذارند و ساختار سلسلهمراتبی را تشکیل دهند. این اصل از کدنویسی ماژولار و قابل استفاده مجدد استفاده میکند و باعث میشود برنامهها به صورت مفهومی و سازمانیافتهتر نوشته شوند.
انتزاع در شیءگرایی در جاوا
در شی گرایی، انتزاع یکی از اصول اساسی است که برای طراحی و پیادهسازی کلاسها و شیءها در زبان برنامهنویسی جاوا استفاده میشود. انتزاع به معنای محدود کردن دسترسی به جزئیات پیادهسازی یک کلاس و فقط ارائه عملکردهای عمومی است. با استفاده از انتزاع، فقط رفتار و عملکرد خارجی یک شیء برای کاربران آن مشخص میشود و جزئیات داخلی آن مخفی میشوند.
در جاوا، انتزاع برای تعریف کلاسها و ارائه رابطهای (interface) عمومی استفاده میشود. رابطها مجموعهای از متدها هستند که عملکرد خارجی یک شیء را تعریف میکنند، اما جزئیات پیادهسازی را مشخص نمیکنند. با استفاده از رابطها، میتوان یک قرارداد عمومی بین کلاسها برقرار کرده و ارتباطات بین آنها را بر اساس این قرارداد تعیین کرد.
با استفاده از انتزاع، کد قابل باز استفادهتر و قابل توسعهتر میشود. با ارائه رابطها و عملکردهای عمومی، میتوان کلاسها را به صورت مستقل از یکدیگر طراحی و پیادهسازی کرد. این امر امکان تغییرات در پیادهسازی را بدون تأثیرگذاری بر کدهای موجود فراهم میکند. همچنین، انتزاع به کاربران شیء اجازه میدهد تا فقط با رابطهای عمومی ارتباط برقرار کنند و جزئیات داخلی کلاس را نادیده بگیرند، که این امر موجب میشود که تغییرات در پیادهسازی کلاس به کاربران تأثیری نداشته باشد.
به طور خلاصه، انتزاع در شیءگرایی در جاوا به معنای محدود کردن دسترسی به جزئیات پیادهسازی یک کلاس و فقط ارائه عملکردهای عمومی است. این مفهوم امکان طراحی کد قابل استفادهتر، مقیاسپذیرتر و قابل توسعهتر را فراهم میکند.
مثالی از نحوه استفاده از شیءگرایی در جاوا
بطور خلاصه، شیءگرایی در جاوا بر اساس ایجاد کلاسها و شیءها استوار است. در زیر یک مثال ساده از استفاده از شیءگرایی در جاوا را مشاهده میکنید:
فرض کنید میخواهیم یک برنامهای بنویسیم که مدیریت یک فروشگاه را انجام دهد. یکی از وظایف مدیر فروشگاه، مدیریت محصولات موجود در فروشگاه است. به جای استفاده از روشهای سنتی مانند استفاده از متغیرها و توابع جداگانه، میتوان از شیءگرایی برای مدیریت محصولات استفاده کرد.
در اینجا، میتوانیم یک کلاس به نام "Product" بسازیم که ویژگیهای مربوط به یک محصول را نگهداری کند. برای مثال، یک محصول میتواند دارای ویژگیهایی مانند نام، قیمت و تعداد موجودی باشد. کلاس "Product" میتواند شامل متغیرها و توابعی باشد که به تعیین و بازیابی این ویژگیها کمک کند.
public class Product {
private String name;
private double price;
private int quantity;
public Product(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
حالا میتوانیم از این کلاس برای ایجاد شیءهای "Product" استفاده کنیم و ویژگیها و عملکردهای آنها را استفاده کنیم. به عنوان مثال:
public class Main {
public static void main(String[] args) {
Product laptop = new Product("Laptop", 1500.0, 10);
System.out.println("Product Name: " + laptop.getName());
System.out.println("Product Price: " + laptop.getPrice());
System.out.println("Product Quantity: " + laptop.getQuantity());
laptop.setQuantity(5);
System.out.println("Updated Quantity: " + laptop.getQuantity());
}
}
در این مثال، یک شیء به نام "laptop" از کلاس "Product" ایجاد میشود و سپس ویژگیهای آن از طریق توابع getter فراخوانی میشود. در نهایت، تابع setter نیز استفاده میشود تا تعداد موجودی محصول را به روز کند.
این مثال نشان میدهد که با استفاده از شیءگرایی، میتوانیم ویژگیها و عملکردهای مربوط به یک شیء را به صورت مجموعهای از توابع در یک کلاس تعریف کنیم و از آنها برای مدیریت و استفاداز اطلاعات مربوط به آن شیء استفاده کنیم. همچنین، با استفاده از کلاس "Product" میتوانیم شیءهای دیگری با ویژگیها و عملکردهای مشابه ایجاد کنیم و برنامه را بهبود بخشیم.
چگونه میتوانیم توابع دیگری به کلاس "Product" اضافه کنیم؟
برای اضافه کردن توابع دیگر به کلاس "Product"، میتوانید متدهای جدید را به آن اضافه کنید. متدهای جدید میتوانند به تعریف ویژگیهای جدید، انجام عملیاتهای محاسباتی یا انجام عملیاتهای دیگر بر روی شیء مربوطه کمک کنند. به طور کلی، شما میتوانید توابعی با هر نام و بازگشتی مورد نظر تعریف کنید.
به عنوان مثال، فرض کنید میخواهید یک متد جدید به نام "calculateTotalPrice" به کلاس "Product" اضافه کنید که قیمت کلی محصول را با توجه به تعداد و قیمت واحد محاسبه کند.
public class Product {
private String name;
private double price;
private int quantity;
public Product(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
// Getter and Setter methods...
public double calculateTotalPrice() {
return price * quantity;
}
}
در این مثال، متد "calculateTotalPrice" به کلاس "Product" اضافه شده است. این متد قیمت کلی محصول را با ضرب قیمت و تعداد واحد محاسبه میکند و مقدار حاصل را برمیگرداند.
حالا میتوانید از این متد در برنامهی خود استفاده کنید. به عنوان مثال:
public class Main {
public static void main(String[] args) {
Product laptop = new Product("Laptop", 1500.0, 10);
double totalPrice = laptop.calculateTotalPrice();
System.out.println("Total Price: " + totalPrice);
}
}
در این مثال، متد "calculateTotalPrice" را روی شیء "laptop" فراخوانی میکنیم و نتیجه را در متغیر "totalPrice" ذخیره میکنیم و در نهایت مقدار آن را چاپ میکنیم.
به این ترتیب، شما قادر به اضافه کردن توابع دیگر به کلاس "Product" بر اساس نیازهای خود خواهید بود. با اضافه کردن توابع جدید، میتوانید قابلیتهای بیشتری را به کلاس "Product" اضافه کنید و آن را برای استفاده در برنامههای خود قابلیت بیشتری ارائه دهید.
مثالی از مفهوم وراثت در جاوا
مفهوم وراثت در جاوا به شما امکان میدهد که یک کلاس جدید را بر اساس یک کلاس موجود تعریف کنید و ویژگیها و رفتارهای آن کلاس را به ارث ببرید و در کلاس جدید خود استفاده کنید. این باعث میشود که کدهای تکراری را کاهش داده و ساختار سلسله مراتبی از کلاسها را ایجاد کنید.
به عنوان مثال، فرض کنید شما یک کلاس پایه به نام "Vehicle" دارید که شامل ویژگیهایی مشترک برای تمام وسایل نقلیه مانند نام، سرعت و قدرت است. سپس میخواهید یک کلاس خودرو به نام "Car" تعریف کنید که ویژگیها و رفتارهای خاص خودروها را داراست.
در این حالت، شما میتوانید از وراثت استفاده کنید تا کلاس "Car" را بر اساس کلاس "Vehicle" تعریف کنید و ویژگیها و رفتارهای مشترک را به ارث ببرید و ویژگیها و رفتارهای خاص خودروها را به آن اضافه کنید.
public class Vehicle {
private String name;
private int speed;
private int power;
public Vehicle(String name, int speed, int power) {
this.name = name;
this.speed = speed;
this.power = power;
}
// Getter and Setter methods...
}
public class Car extends Vehicle {
private int numOfDoors;
public Car(String name, int speed, int power, int numOfDoors) {
super(name, speed, power);
this.numOfDoors = numOfDoors;
}
// Additional methods specific to Car class...
}
در این مثال، کلاس "Vehicle" دارای ویژگیهای مشترک برای تمام وسایل نقلیه است. سپس کلاس "Car" با استفاده از کلید واژه "extends" از کلاس "Vehicle" ارث بری میکند. این باعث میشود که کلاس "Car" ویژگیها و رفتارهای کلاس "Vehicle" را به ارث ببرد. همچنین، کلاس "Car" دارای ویژگی اضافی به نام "numOfDoors" است که تعداد درهای خودرو را نمایندگی میکند. حالا میتوانید از این کلاسها در برنامهی خود استفاده کنید. به عنوان مثال:
public class Main {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle("Generic Vehicle", 100, 200);
System.out.println("Vehicle Name: " + vehicle.getName());
System.out.println("Vehicle Speed: " + vehicle.getSpeed());
System.out.println("Vehicle Power: " + vehicle.getPower());
Car car = new Car("Sedan", 150, 250, 4);
System.out.println("Car Name: " + car.getName());
System.out.println("Car Speed: " + car.getSpeed());
System.out.println("Car Power: " + car.getPower());
System.out.println("Number of Doors: " + car.getNumOfDoors());
}
}
در این مثال، ابتدا یک شیاز کلاس "Vehicle" با نام "vehicle" ایجاد میشود و مقادیر ویژگیهای آن نمایش داده میشوند. سپس یک شیء از کلاس "Car" با نام "car" ایجاد میشود و ویژگیها و روشهای مربوط به کلاس "Vehicle" و کلاس "Car" نمایش داده میشوند.
در نتیجه، کلاس "Car" در این مثال از کلاس "Vehicle" ارث بری کرده است و ویژگیها و روشهای مربوط به کلاس "Vehicle" را به ارث برده است. این نمونهای از مفهوم وراثت در جاوا را نشان میدهد که به شما امکان میدهد کلاسهای جدید را بر اساس کلاسهای موجود تعریف کنید و ویژگیها و رفتارهای آنها را به ارث ببرید و در کلاسهای جدید خود استفاده کنید.
کلام آخر
با استفاده از شیءگرایی در جاوا، میتوانید برنامههای پیچیدهتر را به شکل ماژولار و قابل توسعهتری طراحی کنید، زیرا هر شی تنها مسئولیتها و رفتارهای خود را دارد و با ارتباط و همکاری با سایر اشیا برنامه کامل را تشکیل میدهد. این مفهوم به شما امکان میدهد که برنامهها را به صورت تکهتکه مدیریت کنید و کدها را مجددا استفاده کنید، کدها را سادهتر برای فهمیدن و توسعه دادن کنید و باگها را به راحتی پیدا و اصلاح کنید.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟