Abstract متد
منبع : سایت اندروید توتاریال
Abstract
یعنی خلاصه یا چکیده. فارغ از جزئیات. اقا من به شما میگم برام یک برنامه اندروید بنویس که یک متنی رو چاپ کنه . اصلا برام مهم نیست که شما چطور میخوای اینکارو رو با چندتا متد و تابع انجام بدی. من میخوام در نهایت اون متن رو ببینم.
وقتی مامانت میگه ظرفا رو بشور براش مهم نیست که چطور میخوای بشوری بریزی توی ماشین ظرف شویی ، با فرچه بشوری یا با اسکاچ …. بلاخره باید انجامش بدی چون انجامش ندی خودت و ظرفا رو باهم میشوره .
توی Abstract هم نیازی به جزئیات نداره . فقط میشینه یک گوشه میگه اینکارو بکن و اون کارو بکن . Abstract کلاس رو با کلمه کلیدی Abstract میشه شناخت . یک کلاس abstract میتونه متد abstract رو داشته باشه میتونه نداشته باشه و داخلش از متد concrete (غیر abstract) استفاده شده باشه . اما به این نکته توجه کنید که شما از متد abstract تنها در کلاس Abstract میتونید استفاده کنید و غیر از این معنایی نداره . کلاس abstract غیرقابل استفاده است تا زمانی که آن ها را در کلاس های دیگری extend کرده باشیم
بریم یک مثال بزنیم :
// Declaration using abstract keyword abstract class AbstractDemo{ // Concrete method: body and braces public void myMethod(){ //Statements here } // Abstract method: without body and braces abstract public void anotherMethod(); }
توی مثال بالا متد abstract رو ببینید که بدون بدنه و براکت هستش و متد Concrete دارای بدنه و براکته.
چرا ما به کلاس Abstract نیاز داریم ؟
تابحال شده یک ایده برنامه نویسی به ذهنتون برسه و بدونید باید چیکار کنید و روال رو میدونید اما نمی دونید چطور اینکار رو بکنید … اینجاس که میایم از کلاس Abstractاستفاده میکنیم.یک مثال دیگه باهم ببینیم :
abstract public class AbstractDemo{ public void myMethod(){ System.out.println("Hello"); } abstract public void anotherMethod(); } public class ConcreteDemo{ public void anotherMethod() { System.out.print("Abstract method"); } public static void main(String args[]) { //Can't create object of abstract class - error! AbstractDemo obj = new AbstractDemo(); obj.display(); } }
بنظرتون خروجی چی میتونه باشه ؟!!
یک مرور کنیم کد های بالا رو : اول اومدیم یک کلاس AbstractDemo ساختیم که داخلش از دو متد abstract و concrete استفاده کردیم . و در ادامه یک کلاسConcreteDemo ساختیم و داخلش فقط متد Concrete ساختیم . و در کلاس اصلی main اومدیم یک نمونه جدید از کلاس AbstractDemo ساختیم . سوال پیش میاد؟؟ خوب الان از چه متدی نمونه ساخته میشه ؟!!! اینجاست که برنامه به ما اخطار میده و میگه : آهای خوشگله ، تو نمی تونی از چیزی که کلیات رو تعریف کرده نمونه بسازی . منظورش اینه که از کلاس های abstract فقط میتونی extend کنی نه اینکه نمونه بسازی.
حالا اگه نمونه لازم داشتیم چه کنیم ؟
خیلی سادس از قانون ارث بری استفاده میکنیم . میایم یک بچه میسازیم ( subclass ) و extend اش میکنیم از باباش .
به مثال زیر توجه کنید :
abstract class Demo1{ public void disp1(){ System.out.println("Concrete method of abstract class"); } abstract public void disp2(); } class Demo2 extends Demo1{ /* I have given the body to abstract method of Demo1 class It is must if you don't declare abstract method of super class compiler would throw an error*/ public void disp2() { System.out.println("I'm overriding abstract method"); } public static void main(String args[]){ Demo2 obj = new Demo2(); obj.disp2(); } }
توی مثال بالا اول یک کلاس abstract ساختیم با اسم Demo1 که داخلش دوتا متد وجود داره که اولین متد Concrete ( همه چیزش واضحه ) و دومین متد abstract . در ادامه اومدیم یک subclass ساختیم یعنی Demo2 و ارث بری کردیم از superclass یعنی Demo1 و حالا در اینجا اومدیم متد abstract (یا همون متد disp2 ) رو بکار کشیدیم یا بازنویسی یا Overriding کردیم که برامون یک متنی رو چاپ کنه.
حالا در کلاس اصلی main ، یک نمونه از Demo2 ساختیم . چون در Demo2 همه چیز مشخصه پس خطایی از ما نخواهد گرفت و درنهایت هم گفتیم که نمونه ایی رو که ساختیم نمایش بده.
منبع : سایت اندروید توتاریال