با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن. و کاربرانی که دوره کامل آموزش برنامه نویسی جاوا را دنبال می کنند. abstraction (انتزاع)، در واقع کیفیت و روش انجام یک عمل بدون در نظر گرفتن اقداماتی که در پشت پرده انجام می شود است. به عنوان مثال،اگر شما سیستم ایمیل را در نظر بگیرید، به محض ارسال ایمیل ، پروتکل استفاده از سرور ایمیل شما از کاربر پنهان است. بنابراین، برای ارسال ایمیل شما فقط نیاز به تایپ محتوا، اشاره به آدرس گیرنده، و کلیک کردن روی ارسال را دارید. و به همین ترتیب در برنامه نویسی شیء گرا، انتزاع یک فرایند پنهان کردن جزئیات پیاده سازی از کاربر است و فقط عملکرد شیء به کاربر ارائه می شود، حالا برای آشنایی با کلاس های انتزاعی در جاوا در ادامه ی مباحث با ما همراه باشید.
در ادامه ی مباحث آشنایی با کلاس های انتزاعی در جاوا ما شما را با مفاهیم اولیه ی کلاس های انتزاعی در جاوا آشنا خواهیم کرد.
همچنین با ارائه ی مثال هایی از کد جاوا درک مطلب را برای شما ساده تر می کنیم.
در جاوا، انتزاع با استفاده از کلاس ها و رابط های انتزاعی به دست می آید.
یک کلاس که حاوی کلمه ی abstract در اعلامیه خود است، به عنوان کلاس انتزاعی شناخته می شود.
مثال – برای ایجاد یک کلاس انتزاعی، فقط از کلید واژه abstract قبل از کلمه کلیدی class ، در اعلان کلاس استفاده کنید:
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 | /* File name : Employee.java */ public abstract class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System.out.println("Constructing an Employee"); this.name = name; this.address = address; this.number = number; } public double computePay() { System.out.println("Inside Employee computePay"); return 0.0; } public void mailCheck() { System.out.println("Mailing a check to " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; } } |
شما می توانید ببینید که به غیر از متدهای انتزاعی کلاس کارمند همان کلاس عادی در جاوا است.
کلاس در حال حاضر انتزاعی است، اما هنوز دارای سه فیلد، هفت متد و یک سازنده است.
اکنون می توانید سعی کنید کلاس کارمند را به روش زیر بسازید :
1 2 3 4 5 6 7 8 9 10 | /* File name : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { /* Following is not allowed and would raise error */ Employee e = new Employee("George W.", "Houston, TX", 43); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } } |
هنگامی که کلاس بالا را کامپایل می کنید، خطای زیر را به شما می دهد:
1 2 3 4 | Employee.java:46: Employee is abstract; cannot be instantiated Employee e = new Employee("George W.", "Houston, TX", 43); ^ 1 error |
ما می توانیم خواص کلاس Employee درست مثل کلاس concrete به صورت زیر به ارث بریم:
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 | /* File name : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } public void mailCheck() { System.out.println("Within mailCheck of Salary class "); System.out.println("Mailing check to " + getName() + " with salary " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary >= 0.0) { salary = newSalary; } } public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } } |
در اینجا نمیتوانید کلاس Employee را اکتیو کنید، اما می توانید کلاس Salary را اکتیو کنید.
با استفاده از این مثال می توانید تمام سه فیلد و هفت متد کلاس Employee را در زیر مشاهده کنید:
1 2 3 4 5 6 7 8 9 10 11 12 | /* File name : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00); Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00); System.out.println("Call mailCheck using Salary reference --"); s.mailCheck(); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } } |
نتیجه ی اجرای کد فوق بصورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 | Constructing an Employee Constructing an Employee Call mailCheck using Salary reference -- Within mailCheck of Salary class Mailing check to Mohd Mohtashim with salary 3600.0 Call mailCheck using Employee reference-- Within mailCheck of Salary class Mailing check to John Adams with salary 2400.0 |
اگر می خواهید یک کلاس دارای یک متد خاص بوده و اجرای واقعی آن توسط کلاس فرزند تعیین شود می توانید این متد را در کلاس والد بصورت انتزاعی تعریف کنید.
مثال زیر تعریف یک متد انتزاعی را نشان می دهد:
1 2 3 4 5 6 7 8 | public abstract class Employee { private String name; private String address; private int number; public abstract double computePay(); // Remainder of class definition } |
اعلام یک متد به عنوان انتزاعی دارای دو نتیجه است:
کلاس حاوی آن باید به عنوان انتزاعی اعلام شود.
هر کلاسی که از کلاس فعلی به ارث می برد کلاس فعلی باید هر دو متد را لغو کند یا خودش را انتزاع کند.
در نهایت، یک کلاس descendant باید متد انتزاعی را اجرا کند؛ در غیر این صورت، شما یک سلسله مراتب از کلاسهای انتزاعی دارید که نمیتوان آن را ثابت کرد.
فرض می کنیم که کلاس Salary خواص کلاس Employee را به ارث می برد،سپس باید از متد ()computePay بصورت زیر استفاده کنید:
1 2 3 4 5 6 7 8 9 10 | /* File name : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } // Remainder of class definition } |
در این بخش یاد گرفتیم که چه طور با استفاده از کلاس های انتزاعی در جاوا یک کلاس یا متد را بدون در نظر گرفتن جزئیات آن ایجاد کرده و از ارث بری کنیم. مباحث بخش بعدی را به کپسوله سازی در جاوا اختصاص می دهیم.