شی گرایی در زبان جاوا (وراثت)


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

ارث بری
ارث بری یکی از کلیدی ترین مسائل شی گرایی است.
این ویژگی به ما کمک میکند تا اضافه کاری نداشته باشیم و یه جای این که اطلاعات را به صورت تکراری در کلاس ها تکرار کنیم با یک ساختار نسبتا خیلی خوب به صورت درختی اطلاعات را در سطوح مختلف در کلاس های مختلف نگهداری کنیم.
شما بارها و بارها در محیط های کاری و زندگی خودتان این حالت ها را مشاهده کرده اید؛ مثلا در سیستم دانشگاه که افرادی مثل دانشجو، استاد و کارمند وجود دارند همه‌ی این ها دارای اطلاعات مشترکی هستند، که میشود در هرکدام از کلاس های مخصوص آن ها نگهداری شود، و یا در یک سطح بالاتر و در کلاس والد قرار بگیرند.
در نظر بگیرید در سیستم دانشگاه، شما اطلاعات یک دانشجو شامل: نام، نام خانوادگی، آدرس، تلفن و اطلاعات خاص خودشان یعنی شماره دانشجویی، سال ورود و رشته تحصیلی را دارید و این اطلاعات برای استاد ها و کارمندان نیز هست؛  در این سه موجودیت که مثال زدیم، اطلاعات مشترکی وجود دارد که اگر بخواهیم این ها را در سه کلاس تکرار کنیم، قطعا افزونگی دیتا داریم و داده ها را به صورت تکراری ذخیره میکنیم.
علاوه بر این بروزرسانی و تغییر در ساختار حتما برای ما زمان بر میشود. به طور مثال برای اضافه کردن یک فیلد برای نگهداری کدملی باید تک تک کلاس ها را باز کنیم و ویرایش کنیم، در نتیجه کنترل سخت تر میشود.
مبحث ارث بری به ما کمک میکند که صفت های مشترک بین موجودیت ها را در یک کلاس به عنوان کلاس والد نگهداری کنیم و اطلاعات خاص هرکدام از این موجودیت ها را در کلاس خاص خودشان ذخیره کنیم و هر کلاسی از کلاس والد ارث بری کند.

 

وقتی یک کلاس از کلاس والدش ارث‌بری کند، میتواند اطلاعات پایه‌ی آن کلاس را نسبت به این که سطح دسترسی چطور باشد برای خودش داشته باشد.
همین مثال را در قالب کد نویسی برای درک بهتر عنوان میکنیم.
ما بجز کلاس اصلی، سه کلاس دیگر داریم که به ترتیب کلاس Person ، کلاس Student، و کلاس Teacher  میباشند که در کلاس Student  و Teacher اطلاعات مختص به خودشان و در کلاس Person اطلاعات عمومی مربوط به استادان و دانشجویان نگهداری میشود.

کد کلاس اصلی:

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Person person1=new Person();
		Student student1=new Student();
		Teacher teacher1=new Teacher();
		
	}

}

کد کلاس Student: 

package package1;			

public class Student {
	String StudentId;
}

کد کلاس Teacher: 

package package1;		

public class Teacher {
	String TeacherCode;
}

کد کلاس Person: 

package package1;			

public class Person {
	String Name;
	String Family;
	int Age;
}


اگر ما در کلاس اصلی، از کلاس Person  یک شی بسازیم، برای این شی ما میتوانیم صفت های Name و Family و Age را ببینیم؛ یک شی هم از کلاس Student میسازیم، این شی هم صفت StudentId که مختص کلاس Student میباشد قابل رویت است؛ و همچنین یک شی از کلاس Teacher میسازیم، از این شی هم که صفت TeacherCode مختص کلاس آن است قابل دسترسی است.
برای این که یک کلاس، فرزند کلاس دیگری باشد، کافی است موقع تعریف کلاس از کلمه extends استفاده کنیم و نام کلاسی که قرار است والدش بشود را بعد از این کلمه تعیین کنیم به شکل زیر:

 

package package1;			

public class Student extends Person{
	String StudentId;
}


حالا اگر یک شی از همان کلاس Student بسازیم میبینیم که به صورت مورثی از صفت های کلاس والدش نیز میتوان استفاده کرد، برای کلاس Teacher نیز به همین صورت میتوان استفاده کرد.
مثال: فرض کنید میخواهیم اطلاعات نام، نان خانوادگی و سن یک فرد را چاپ کنیم، برای این کار یک تابع در کلاس Person مینویسیم:

 

package package1;		

public class Person {
	String Name;
	String Family;
	int Age;
	
	public void PrintPersonInfo() {
		System.out.println("Name :"+Name+"\tFamily :"+Family+"\tAge :"+Age);
	}
}


حالا برای استفاده از این عملیات چاپ، در کلاس اصلی تابع PrintPersonId از کلاس Person را فراخوانی میکنیم:
 

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Person person1=new Person();
		Student student1=new Student();
		Teacher teacher1=new Teacher();
		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}


حالا اگر برنامه را اجرا کنیم قطعا خروجی های ما null خواهد بود؛ چرا؟ چون هنوز هیچ مقداری به آن ها نداده ایم؛ در واقع کلاس Person این فیلد هایی که دارد، هنوز پر نشده اند که برای ما مقدار خروجی داشته باشد؛ برای پر کردن این فیلد ها، دو روش داریم، یا باید از Setter ها استفاده کنیم، یا از سازنده ها.
ترجیح میدهیم از سازنده استفاده کنیم؛ در کلاس Person همان طور که در جلسات گذشته آموزش دادیم یک سازنده تعریف میکنیم.

 

package package1;			

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


میبینیم که چندین خطا رخ داده است؛ اگر کلاسی فرزند یک کلاس باشد که آن کلاس دارای سازنده ای غیر پیشفرض باشد باید در لحظه‌ی ساخته شدن شی کلاس فرزند، سازنده‌ی کلاس والد تامین شود؛ در آن لحظه که شی ای از کلاس Student تعریف میکنیم، متد سازنده  اش فراخوانی میشود، چون Student فرزند کلاس Person میباشد و Person خودش سازنده دارد، پس حتما باید برای Student یک سازنده بنویسیم:
 

package package1;			

public class Student extends Person{
	public Student() {
		
	}
	String StudentId;
}


در لحظه شروع باید سازنده کلاس والد را فراخوانی کنیم و برای آن مقادیر ارسال کنیم:
 

package package1;  			

public class Student extends Person{
	public Student() {
		super("ali","rezaie",30);
	}
	String StudentId;
}


با کلمه کلیدی super سازنده کلاس والد فراخوانی می شود؛
برای گرفتن ورودی برای پر کردن فیلدها به روش زیر عمل می کنیم:

 

کد کلاس Student:

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;
}

کد کلاس اصلی: 

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Teacher teacher1=new Teacher();
		

		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}

 


حالا یک شی دیگر با نام Student2 می سازیم و اطلاعات آن را پر می‌کنیم:
 

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher();
		

		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}


همین کارها را برای کلاس Teacher نیز انجام می دهیم:
 

کد کلاس Teacher:

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;
}

 کد کلاس اصلی:

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher("Mehdi","Abbasi",39,1000);
		

		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}

 


حالا با استفاده از همان تابع اطلاعات عمومی را برایمان چاپ می‌کرد اطلاعات را چاپ می کنیم:
 

package package1;			

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher("Mehdi","Abbasi",39,1000);
		

		
		student1.PrintPersonInfo();
		student2.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}


اگر بخواهیم می توانیم در هر کدام از کلاس ها مختص خودشان یک Print بنویسیم که StudentId را چاپ کند:
برای کلاس Student :

 

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;
	
	public void Print() {
		System.out.println("Student Id is :"+StudentId);
		
	}
}


برای کلاس Teacher :
 

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;
	public void Print() {
		System.out.println("Teacher Code is :"+TeacherCode);
		
	}
}


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

package package1;			

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher("Mehdi","Abbasi",39,1000);
		

		
		student1.PrintPersonInfo();
		student1.Print();
		student2.PrintPersonInfo();
		student2.Print();
		teacher1.PrintPersonInfo();
		teacher1.Print();
	}

}

 


نظر بدهید

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

مشخصات دوره


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

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

درباره مدرس :

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