صفحه اصلی / دوره‌های آموزشی / آموزش جاوا مقدماتی تا متوسط / شی گرایی در زبان جاوا (کلاس abstract )

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

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

جلسات دوره


                         
مهدی عباسی
مدرس:

مهدی عباسی

18 سال سابقه برنامه‌نویسی و تدریس برنامه‌نویسی
کسب مقام‌های اول و دوم کشوری در مسابقات برنامه‌نویسی

مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه

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، همه‌ی رفتار هایی که برای کلاس های معمولی داشتیم، داشته باشیم؛ به طور مثال میتوانیم یک متد استاتیک داشته باشیم.

نظرات دانشجویان

نظر شما در تصمیم دیگران اثرگذار است.

لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.

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

193