آموزش جاوا - قسمت هفتم
چنگانی هستم و با آموزش جاوا، جلسه هفتم در خدمتتون هستم.
این جلسه در مورد ارثبری صحبت خواهیم کرد و اینکه چطوری در جاوا پیادهسازی میشود.
مفهوم ارث بری وقتی خودش رو خیلی زیاد نشون میده که سلسهمراتبی در سیستم ما وجود داشته باشد و بخواهیم به جای تکرار زیاد، یک سری از ویژگیها و توانایی ها را بین کلاس ها به اشتراک بگذاریم.
و به طور کلی وقتی ارثبری کاربردی میشود که موجودیتهای ما وجه اشتراک داشته باشند و برای تکرار نکردن این ویژگیها از ارث بری استفاده میکنیم.
شبیه پدر و پسر که چون خیلی از ویژگیها رو پسر دارد نیاز به گفتنش نیست فقط کافی هست بگیم پدر این پسر فلان کس هست تا ما همه ویژگیها و تواناییهای پدر را به پسر نسبت بدهیم.
خوب برای روشن شدن موضوع اول بریم سراغ مفهوم پدر و فرزند در ارثبری:
کلاس پدر یا Superclass در واقع کلاسی هست که قرار هست ما از ان ارث ببریم و ویژگیهای ان را برای خودمان کنیم و استفاده کنیم. در جاوا هر کلاسی میتواند به عنوان کلاس پدر انتخاب شود (به جز موارد خاص) بنابراین شرایط خاصی وجود نخواهد داشت:
public class Animal {
}
کلاس فرزند یا Subclass در واقع کلاسی هست که از یک پدر ارث میبرد. در جاوا ارثبری هم برای ویژگیها و هم برای تواناییها هست. در واقع کلاس فرزند هم ویژگیها و هم تواناییهای پدر را به ارث میبرد.
public class Dog extends Animal{
}
در جاوا از کلمه کلیدی extends برای به ارث بردن استفاده میشود. در این مثال کلاس Dog از کلاس Animal ارث برده میشود.
اجازه بدید بگویم ما اشیاء سگ و گربه را داریم. سگ و گربه هر دو حیوانند بنا بر این به طور طبیعی ما میتوانیم یک سوپر کلاس به نام حیوان درست کنیم که ویژگیهای همه حیوانات را داشته باشد و سپس ویژگیهای خاص را برای یک سگ و یک گربه بسازیم.
اجازه دهید با سوپر کلاس یعنی کلاس حیوان شروع کنیم. اینجا می توانیم متغیر ها و متد هایی رو دست کنیم که همه حیوانات میتوانند داشته باشند. هم اکنون ما همه چیز را ساده میکنیم و فقط یک متغیر و دو متد که همه حیوانات میتوانند داشته باشند را درست می کنیم.
public class Animal {
private boolean pet = true;
public void sleep() {
System.out.printIn("Sleeping");
}
public void eat() {
System.out.printIn("Eating");
}
}
کلاس فرزند یا همان کلاس dog هم به این صورت:
public class Dog extends Animal{
}
خوب الان میتونیم به اینصورت نوشت:
public static void main (String[] args){
Dog d = new Dog();
d.sleep();
}
خوب همان طور که میبیند کلاس dog متدی به نام sleep ندارد ولی چون ما از کلاس animal ارث بردیم پس کلاس فرزند هم دارای توانایی پدر نیز میشود.
به طور کلی ویژگیها و متدهای که به صورت public تعریف شدهاند در دسترس نمونههایی که از کلاس فرزند ساخته میشود قرار میگیرد.
خوب بیایم الان کلاس dog را تکمیل کنیم:
public class Dog extends Animal{
public void bark() {
System.out.printIn("Woolf!");
}
}
فقط سگها میتوانند پارس کنند بنا بر این زیر کلاس این متد را دارد. سوپر کلاس هرگز به این متد دسترسی ندارد.
در واقع متد bark فقط برای کلاس dog هست
خوب الان کلاس cat رو هم تکمیل کنیم:
این متد فقط در کلاس گربه وجود دارد. سگها چیزی از این متد نمیدانند و همچنین سوپر کلاس هم چیزی از این متد نمی داند. و این همان چیزی است که ارث بری در جاوا را چنین قدرتمند می کند: توانایی تعریف متد ها و متغیر های مشترک در یک مکان و استفاده از آنها دوباره و دوباره. جاوا اشیاء خودش را به شکل سلسله مراتبی میسازد و چه زیباست از این فایده استفاده کنیم. حتی دلایل بیشتری برای قدرتمندی ارث بری در جاوا وجود دارد اما ما به آن دلایل در این درس نامه نمی پردازیم.
در واقع کلاسهای فرزند در ویژگیها و تواناییهای پدر مشترک هستند ولی هر کدام میتواندد ویژگیهای خودشان را داشته باشند و حتی میتوانند این توانایی یا ويژگیهای ارث برده شده را برای خود تغییر داده و استفاده کنند.
public class Cat extends Animal {
@Override
public void sleep() {
System,out.printIn("cat Sleeping");
}
public void meow () {
System.out.printIn("Meow!");
}
}
خوب @Override در واقع بیان گر این هست که شما متدی با همین اما در کلاس پدر دارین و فرزند داره این متد رو بازنویسی میکند
که این علامت بازگو کننده همین مطلب هست
خوب چند نکتهای در ارث بری وجود دارد که شاید فهمیدنشون لازم باشه. فرض کنید کلاس پدر یه متغییر به نام a داشته باشد. همچنین کلاس فرزند نیز یک متغییر همنام با a داشته باشد که متفاوت باشند! چطوری این موضوع رو باید در جاوا حل کرد؟
public class Animal {
private boolean pet = true;
public int a;
public void sleep() {
System.out.printIn("Sleeping");
}
public void eat() {
System.out.printIn("Eating");
}
}
public class Dog extends Animal{
public int a;
public void bark() {
System.out.printIn("Woolf!");
}
}
خوب اگر در کلاس فرزند بخواهیم هر دو متغییر را مقدار دهی کنیم چطوری باید تمایز ایجاد کنیم؟
خوب از دو کلمه کلیدی this برای اشاره به متغییر در کلاس فرزند و کلمه کلیدی super برای متغییر کلاس پدر استفاده میکنیم.
public class Dog extends Animal{
public int a;
public void bark() {
System.out.printIn("Woolf!");
}
publiv void print(){
this.a = 5;
super.a = 10;
System.out.printIn("this.a = " + this.a);
System.out.printIn("super.a = " + super.a);
}
}
همچنین هم باید دقت شود اگر کلاس پدر دارای سازنده باشد، حتما کلاسهای فرزند موظف هستند که این سازنده را مقدار دهی کنند وگرنه اجازه ارثبری نخواهند داشت. که فرخوانی سازنده کلاس پدر با کلمه کلیدی super() انجام میشود و همچنین الزامی وجود دارد بر اینکه مقدار دهی سازنده پدر همیشه در خط اول سازنده فرزند باشد!
نظرات کاربران