شی گرایی در زبان جاوا (کلاس abstract )


شی گرایی در زبان جاوا (کلاس abstract )
برای خرید این درس نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.

Abstract تلاش میکند که جزئیات عملکرد را از دید کاربر مخفی کنیم؛ می خواهیم یک سری امکانات در کلاس ها قرار بدهیم و کلاس هایی که از آنها ارث می برند بتوانند آنها را انتزاعی سازی کنند.
برای درک بهتر این مفهوم به مثال زیر دقت کنید:
مثال:
Abstract را می‌توان به متدها و کلاسها اضافه کرد.
متد های Abstract را فقط می توان در کلاس های Abstract استفاده کنید پس اگر قرار باشد ما از مبحث انتزاعی سازی استفاده کنیم حتماً اول باید کلاس را Abstract کنیم.
و برای این کار کافی است قبل از کلمه class، کلمه Abstract را بنویسید.

 

package package1;

public abstract class Person {
	String Name;
	String Family;
	int Age;
	
	public Person(String name,String family,int age)
	{
		Name=name;
		Family=family;
		Age=age;
	}

}


با این کار، این کلاس تبدیل شد به یک کلاس انتزاعی.
زمانی که ما یک کلاس را به صورت انتزاعی استفاده میکنیم دیگر اجازه‌ی تعریف نمونه یا شی از این کلاس را نداریم.
یعنی اگر در هر جا از این کلاس یک شی تعریف کنیم برنامه دچار خطا میشود.
کلاس های Abstract میتوانند درصدی از انتزاعی سازی را داشته باشند.
یعنی میتوانیم یک تعداد متد و فیلد داشته باشیم که Abstract نشده اند و یا این که تصمیم داریم یک و یا چند متد را Abstract کنیم.
برای مثال یک متد تعریف میکنیم با نام PrintPersonInfo که قرار است برای ما اطلاعات اصلی را چاپ کند و Abstract نیست.

 

package package1;

public abstract class Person {
	String Name;
	String Family;
	int Age;
	
	public Person(String name,String family,int age)
	{
		Name=name;
		Family=family;
		Age=age;
	}
	void PrintPersonInfo() {
		System.out.println("Name is :"+Name+"\tFamily is :"+Family+"\tAge is :"+Age);
	}

}


و حالا یک متد تعریف میکنیم با نام Sum که  Abstract  میباشد:
 

package package1;

public abstract class Person {
	String Name;
	String Family;
	int Age;
	
	public Person(String name,String family,int age)
	{
		Name=name;
		Family=family;
		Age=age;
	}
	void PrintPersonInfo() {
		System.out.println("Name is :"+Name+"\tFamily is :"+Family+"\tAge is :"+Age);
	}
	abstract int Sum(int a,int b)
	{
		return a+b;
	}
	
}


میبینیم که برنامه دچار خطا شده است و دلیل آن این است که متد های Abstract بدنه ندارند ولی ما برای این متد بدنه تعریف کرده ایم که باید به شکل زیر تا خطا رفع شود:
 

package package1;

public abstract class Person {
	String Name;
	String Family;
	int Age;
	
	public Person(String name,String family,int age)
	{
		Name=name;
		Family=family;
		Age=age;
	}
	void PrintPersonInfo() {
		System.out.println("Name is :"+Name+"\tFamily is :"+Family+"\tAge is :"+Age);
	}
	abstract int Sum(int a,int b);
	
	
}


حالا ممکن است این سوال پیش بیاید که مگر ما متدی داریم که بدنه نداشته باشد؟
و آیا ارزشی برای ما اضافه میکند؟
متد های Abstract بدنه ندارند اما حتما فرزندان کلاس Abstract باید این متد ها را پیاده سازی کنند.
همانطور که میبینید در کلاس های فرزند، خطا ایجاد شده است و علتش این است که اگر در یک کلاس Abstract متدی وجود داشته باشد که Abstract باشد حتما باید فرزندان این کلاس آن متد را دوباره نویسی کنند. یعنی باید همان متدی که در کلاس والد وجود دارد را پیاده سازی کنند و تعیین کنند که بدنه متد چه میباشد :

 

package package1;

public class Student extends Person{
	public Student(String name, String family, int age,int studentid) {
		super(name, family, age);
		StudentId=studentid;
		
	}

	int StudentId;

	@Override
	int Sum(int a, int b) {
		return a+b;
	}

}


برای این که کلاس های فرزند را مجبور کنیم که اطلاعات خاص خود را همراه با اطلاعات عمومی چاپ به شکل زیر عمل میکنیم:
 

package package1;

public abstract class Person {
	String Name;
	String Family;
	int Age;
	
	public Person(String name,String family,int age)
	{
		Name=name;
		Family=family;
		Age=age;
	}
	void PrintPersonInfo() {
		System.out.println("Name is :"+Name+"\tFamily is :"+Family+"\tAge is :"+Age);
	}
	abstract int Sum(int a,int b);
	abstract void Print();
		
	
	
	
}
package package1;

public class Student extends Person{
	public Student(String name, String family, int age,int studentid) {
		super(name, family, age);
		StudentId=studentid;
		
	}

	int StudentId;

	@Override
	int Sum(int a, int b) {
		return a+b;
	}

	@Override
	void Print() {
		System.out.println("StudentId Is :"+StudentId);
		
	}

}
package package1;

public class Teacher extends Person{
	public Teacher(String name, String family, int age,int teachercode) {
		super(name, family, age);
		TeacherCode=teachercode;
	}

	int TeacherCode;

	@Override
	int Sum(int a, int b) {
		return a+b;
	}

	@Override
	void Print() {
		System.out.println("TeacherCode Is :"+TeacherCode);
		
	}
}


این مفهوم را هرجایی میتوان برای انتزاعی کردن اعمال کنیم.
حالا برای استفاده از کدی که نوشته ایم به شکل زیر عمل میکنیم:
همانطور که گفتیم نمیتوانیم از کلاسی که Abstract شده است شی تعریف کنیم اما میتوانیم از فرزندان این کلاس نمونه تعریف کنیم به شکل زیر:

 

package package1;

public class MainClass {

	public static void main(String[] args) {
		Person s1=new Student("Ali", "Ahmadi", 25, 100);
		Person t1=new Teacher("Mehdi", "Abbasi", 39, 1000);
		


	}

}


برای چاپ اطلاعات به شکل زیر عمل میکنیم:
 

package package1;

public class MainClass {

	public static void main(String[] args) {
		Person s1=new Student("Ali", "Ahmadi", 25, 100);
		Person t1=new Teacher("Mehdi", "Abbasi", 39, 1000);
		
		s1.PrintPersonInfo();
		s1.Print();
		
		t1.PrintPersonInfo();
		t1.Print();

	}

}


ما میتوانیم در کلاس های Abstract، همه‌ی رفتار هایی که برای کلاس های معمولی داشتیم، داشته باشیم؛ به طور مثال میتوانیم یک متد استاتیک داشته باشیم.


برچسب ها :

کلاس abstract در جاوا متدهای abstract در جاوا

نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد .
برای ارسال نظر نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.

مشخصات دوره


مدرس دوره : مهدی عباسی
تعداد جلسات 26 جلسه
مدت زمان 685 دقیقه
حجم دوره 1/84 گیگابایت
سطح مهارت مقدماتی
وضعیت دوره پایان یافته
: میانگین امتیاز دوره

رایگان
برای دسترسی به این دوره وارد یا عضو شوید.
مهدی عباسی
مهدی عباسی

درباره مدرس :

مدیر‌ عامل‌ شرکت آریا‌ نرم‌‌ افزار دارنده مدرک کارشناسی‌ ارشد مهندسی کامپیوتر 12‌ سال سابقه تدریس دروس کامپیوتر را در دانشگاههای دولتی، آزاد، پیام‌نور ملایر، شهیدشمسی‌پور تهران و تدریس برنامه‌نویسی در انیستیتو ایزایران، مجتمع فنی و موسسه راه‌آینده تهران دارا میباشد و تا به حال راهنمایی انجمنهای علمی دانشگاه و صدها پروژه دانشجویی را برعهده داشته است. تخصص اصلی: با داشتن گواهی‌نامه‌های معتبر تدریس از انیستیتو‌ ایزایران، راه آینده‌تهران و سازمان‌فنی‌حرفه‌ای، تدریس و آموزش‌ دروس کامپیوتر، ‌برنامه‌نویسی کامپیوتر و کلاسهای کنکور کارشناسی و کارشناسی‌ارشد میباشد.همچنین تجربه داوری و نظارت مسابقات برنامه‌نویسی کشوری‌ACM را در سالهای متعدد داشته و تیم مورد رهبری ایشان در 3سال متوالی مقام اول مسابقات کشوری را از آن خود کرده است.ایشان مقالاتی در زمینه شبکه‌های کامپیوتری، تکنیک‌های وزارت دفاع و ... به ثبت رسانده و مشاور و کارشناس در طراحی و برنامه نویسی بیش از 50‌برنامه کاربردی تحت وب و ویندوز و موبایل میباشد. افتخارات دیگر:کسب مقام دوم ایده‌های برتر در مسابقات استارت‌آپ و بکند کشوری را نام برد.