سلام وظیفه تابع super() چیست؟ چون یک کلاس دیدم در سازندش فقط نوشته بود super()
می خواستم ببینم چیکار می کنه؟
سلام وظیفه تابع super() چیست؟ چون یک کلاس دیدم در سازندش فقط نوشته بود super()
می خواستم ببینم چیکار می کنه؟
کلمهی کلیدی super به کلاس والد اشاره می کنه، با این کلمه کلیدی میشه به متدها و فیلدهای public و protected کلاس والد دسترسی داشت.
متد super()، سازنده ی بدون پارامتر کلاس والد رو اجرا می کنه:
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Son kian = new Son();
kian.howOldAmI();
kian.howOldIsMyMother();
}
}
class Mother {
int age = 35;
public Mother(String childName){
System.out.println("I'm " + childName + "'s mother and I'm " + age);
}
public Mother(){
System.out.println("Mother is " + age);
}
public void ageAndPrint(int age){
this.age = age;
System.out.println(this.age);
}
public void howOldAmI(){
System.out.println("I, Mother; am " + age);
}
}
class Son extends Mother {
int age = 6;
public Son(){
super("Kian");
System.out.println("Son is " + age);
}
void howOldIsMyMother(){
System.out.println("My Mother is " + super.age);
}
@Override
public void howOldAmI(){
System.out.println("I am " + age);
super.howOldAmI();
}
}
خروجی:
I'm Kian's mother and I'm 35
Son is 6
I am 6
I, Mother; am 35
My Mother is 35
اینجا میتونید کدها رو ببینید و تست کنید: http://ideone.com/j2ugdu
وقتی کلاس ما از کلاس والد ارث بری می کنه چه نیازی به super داریم؟
اول باید اشاره بشه که super کلمه ی کلیدی هست که دسترسی به کلاس والد رو فراهم می کنه و متد ()super یک استفاده ی خاص از این کلمه ی کلیدی هست که کانستراکتور بدون پارامتر (یا در مثال من که کلاس والد دو کانستراکتور داره، نسخه ی پارامتر دار) رو صدا میزنه.
ما مفهومی داریم بنام Method Overriding که به ما اجازه میده متدی که در کلاس والد داریم رو در کلاس خودمون پیاده سازی و شخصی سازی کنیم.
اساس کار ما در اندروید همین قابلیت هست، که فریم وورک اندروید کلاس هایی رو در اختیار ما قرار داده که چارچوب کلی در اونها ساخته شده و ما با شخصی سازی متدهای اون کلاس، نتایج متفاوت در چارچوب اون ساختار رو بدست میاریم.
مثلاً کلاس Activity رو درنظر بگیرید، بسیاری از کارها در متد onCreate صورت میگیره که همیشه بالاش یک Annotation به شکل @Override رو میبینیم، که در واقع اشاره می کنه که این متد، Override شده از همین متد در کلاس والد هست. دقیقاً از طریق همین Method Overriding هست که اندروید میدونه که باید چه متدی در کلاس ما رو فراخوانی کنه تا Activity ساخته بشه.
اتفاقاً در همین متد می بینیم که قبل از هر چیز، کد super.onCreate() رو صدا میزنیم، همین قابلیت به ما اجازه میده که ابتدا کدهای متد onCreate در کلاس والد رو اجرا کنیم تا هرکاری لازمه برای آماده سازی اکتیویتی ما انجام بده و بعد کدهای خودمون رو می نویسیم تا شخصی سازی های لازم رو انجام بدیم.
با اینکار Framework تمام پیچیدگی هاش رو از چشم ما پنهان کرده و ما فقط با رعایت این چارچوب برنامه مون رو مینویسیم و میدونیم که با تبعیت از قواعد طرح شده توسط فریم وورک برنامه ی ما به درستی کار خواهد کرد.
ممنون از پاسخگوی تون باید بیشتر کار کنم تا درکش کنم
اگر ما یک شی از کلاس والد تعریف کنیم می تونه وظایف کلمه کلیدی super رو انجام بده؟
super در بحث وراثت معنی پیدا می کنه و اگر از وراثت استفاده می کنید، موضوعیتی نداره که برای دسترسی به متدها یا فیلدها ی کلاس والد، یک آبجکت از کلاس والد در کلاس فرزند بسازید و هزینه ی ایجاد یک آبجکت دیگه رو به سیستم تحمیل کنید.
اگر از وراثت استفاده نمی کنید (مثلاً از Composition برای ایجاد رابطه بین یک یا چند کلاس استفاده می کنید)، چون ارتباط وراثتی بین کلاس ها وجود نداره، super کمکی بهتون نمیکنه.