کار با کلاس ها (class) ، در برنامه نویسی اندروید

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
فهرست تاپیک:

  1. اجرای متعدد یک سری کد در Activity های مختلف، بدون احتیاج به دوباره نوشتن آنها، با ساخت یک کلاس (Class) جدید، در برنامه نویسی اندروید
  2. ساخت یک کلاس (class) جدید با قابلیت دریافت Context مربوط به Activity ، در برنامه نویسی اندروید
  3. ساخت یک روش (Method) جدید در یک کلاس (Class)، در برنامه نویسی اندروید
  4. استفاده از یک متغیر از پیش تعریف شده، در یک کلاس (Class) یا یک روش (Method)، هنگامی که متغیر با روش متفاوتی تعریف شده باشد (راه حلی برای خطای Cannot refer to a non-final variable * inside an inner class defined in a different method)، در برنامه نویسی اندروید

منبع: kelidestan
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
اجرای متعدد یک سری کد در Activity های مختلف، بدون احتیاج به دوباره نوشتن آنها، با ساخت یک کلاس (Class) جدید

اجرای متعدد یک سری کد در Activity های مختلف، بدون احتیاج به دوباره نوشتن آنها، با ساخت یک کلاس (Class) جدید

حتما تاکنون برایتان پیش آمده است که یک سری کد را باید چندین بار در Activity های مختلف می نوشته اید و بنابراین علاوه بر زیاد شدن حجم کدهای برنامه اندروید، با این مشکل نیز مواجه بوده اید که برای تغییر آن کدها، باید کدهای Activity های مختلف را تغییر می داده اید. اما این مشکل، یک راه حل دارد و آن این است که یک کلاس (class) جدید برای برنامه اندروید تعریف کنید و کدهای مورد نظر خود را در آن قرار بدهید، سپس هر زمان که لازم باشد، در Activity دلخواه، یک شیء (object) از آن کلاس (class) می سازید و کدهای مربوط به آن را اجرا می کنید. چگونگی این عملیات را در ادامه با مثال هایی شرح خواهیم داد.

مفاهیم مربوط به کار با کلاس ها (class) گسترده است و ممکن است یک عملیات دلخواه را بتوانیم با چندین روش انجام بدهیم، اما ما قصد نداریم این مبحث بیش از حد طولانی شود و بنابراین برای هر حالت، یک کد را بیان می کنیم که ما را به هدفمان می رساند، اما در سایر مباحث سایت کلیدستان سعی می کنیم که مفاهیم به صورت وسیعتری شرح داده شوند و انواع روش های اجرای عملیات ها نیز بیان شوند.

قبل از اینکه در مورد ساخت کلاس (class) صحبت کنیم، بهتر است که حالت هایی که معمولا پیش می آید را شرح بدهیم :
از نظر دریافت ورودی توسط کلاس (class)، دو حالت داریم :
1- کلاس (class) مورد نظر، نیازی به دریافت ورودی ندارد.
2- کلاس (class) مورد نظر، نیاز به دریافت ورودی دارد.

از نظر برگرداندن خروجی توسط کلاس (class)، دو حالت داریم (یعنی کلاس به Activity مورد نظر، مقدار یا مقدارهایی را برگرداند یا خیر) :
1- کلاس (class) مورد نظر، هچیچ خروجی را برنمی گرداند.
2- کلاس (class) مورد نظر، یک یا چند خروجی را برمی گرداند.

همان طور که گفتیم، در Activity های مختلف، از آن کلاس (class)، شئ (object) می سازیم، بنابراین بر اساس شناسایی Activity بر اساس Context مربوط به Activity ، دو حالت زیر را داریم :
1- کدهایی که می خواهیم در کلاس (class) بنویسیم به گونه ای است که نیاز به شناسایی Activity بر اساس Context مربوط به Activity دارد (بنابراین باید Context مربوط به Activity را به عنوان ورودی به آن کلاس بفرستیم).
2- کدهایی که می خواهیم در کلاس (class) بنویسیم به گونه ای است که نیاز به شناسایی Activity بر اساس Context مربوط به Activity ندارد.


ساخت یک کلاس (class) جدید، در پروژه اندروید :

ابتدا چگونگی ساخت یک کلاس (class) جدید را شرح می دهیم (بعدا با تغییر دادن کدهای کلاس، می توانیم حالت های مختلف مورد نظرمان را برای آن ایجاد کنیم). فرض کنید در برنامه eclipse ، یک پروژه اندروید داریم که تنها دارای یک Activity با نام MainActivity.java می باشد :

964.jpg

اکنون می خواهیم یک کلاس (class) جدید با نام MyClass در پروژه اندروید بسازیم. برای این منظور، بر روی نام پروژه اندروید (یا نام package آن)، با موس، کلیک سمت راست نموده و ابتدا گزینه New و سپس گزینه Class را انتخاب می کنیم :



965.jpg

پنجره ای به شکل زیر نمایش داده می شود :

966.jpg
در قسمت Package ، باید package ای که می خواهیم کلاس (class) جدید در آن قرار بگیرد را انتخاب کنیم. برای این منظور، بر روی دکمه Browse در جلوی آن کلیک می کنیم و package پروژه اندروید را انتخاب می کنیم (یا اگر package های دیگری در پروژه اندروید دارید، می توانید یکی از آنها را انتخاب کنید) :




967.jpg

پس از انتخاب نام package ، بر روی دکمه OK کلیک می کنیم.
در قسمت Name ، باید نام مورد نظرمان برای کلاس (Class) را بنویسیم (مثلا من نام MyClass را انتخاب می کنم).
در قسمت Superclass ، باید یک کلاس را به عنوان Superclass انتخاب کنید. برای تغییر موردی که از قبل برای آن تعیین شده است، بر روی دکمه Browse کلیک می کنیم تا پنجره ای به شکل زیر نمایش داده شود :

968.jpg

در قسمت Choose a type ، کلمه test را می نویسیم تا موردی با عنوان TestCase - junit.framework نمایش داده شود :


969.jpg

همین مورد را انتخاب کرده و بر روی دکمه OK کلیک می کنیم. بنابراین گزینه های انتخاب شده در پنجره، به صورت زیر می باشد :


970.jpg

بر روی دکمه Finish کلیک می کنیم تا کلاس (class) جدید ساخته شود (فایل مربوط به آن نیز باز شده و کدهایش نمایش داده می شود) :


971.jpg

بنابراین کدهای کلاس MyClass به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
نکته :

اگرچه موارد مربوط به کلاس را در محیطی گرافیکی تعیین کردیم، ولی اکنون با ویرایش کدهای فایل MyClass.jaa نیز می توانیم آنها را تغییر بدهیم. به عنوان مثال، superclass را می توانیم با تغییر دو خط زیر از کدها، تغییر بدهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR][/FONT]
[/FONT][/COLOR]
ابتدا باید عبارت junit.framework.TestCase تغییر داده شده و سپس TestCase نیز باید تغییر یابد (یعنی نام کلاسی که بر اساس توسعه (extend) آن در حال ساخت این کلاس جدید هستیم).

خوب اکنون قصد داریم کدهایی که باید چندین بار در برنامه اندروید اجرا شوند را در کلاس MyClass بنویسیم. برای کدنویسی، دو حالت کلاس با ورودی و کلاس بدون ورودی را شرح خواهیم داد.

نوشتن کدهای کلاس (class)، در حالتی که کلاس به ورودی نیاز ندارد :

در این حالت، چون کدهای مورد نظرمان، نیاز به دریافت اطلاعات از Activity ندارند، بنابراین کلاس هیچ ورودی نخواهد داشت. به عنوان مثال، فرض کنید بخواهیم کدهای محاسباتی زیر را در کلاس بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
[B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
[B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number3 [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
محاسبه بالا، تنها ضرب دو عدد در یکدیگر و به دست آوردن نتیجه می باشد (یک محاسبه بسیار ساده).بنابراین کدهای کلاس MyClass به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
        
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number3 [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون برای اینکه این کدها در Activity مورد نظرمان اجرا شوند، باید کد زیر را در میان کدهای Activity بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
با کد فوق، از کلاس MyClass ، یک شیء (object) با نام myClass ساخته ایم. با توجه به ساختار کدهای کلاس MyClass ، به محض ساخته شدن شیء، آن چند خط کد محاسباتی اجرا خواهند شد.

کل کدهای Activity می تواند مشابه کدهای زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

   
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
نوشتن کدهای کلاس (class)، در حالتی که کلاس به ورودی نیاز دارد :

برای حالتی که نیاز به یک یا چند ورودی داریم، دو روش مختلف را شرح می دهیم :

روش اول :

فرض کنید که همان محاسبات را بخواهیم انجام بدهیم، اما قصد داشته باشیم که دو عدد را از Activity دریافت کنیم، بنابراین، باید کدهای کلاس MyClass را به صورت زیر تغییر بدهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
        
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number3[COLOR=#339933];[/COLOR]
    
    [B]public[/B] MyClass [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] number1, [COLOR=#000066][B]int[/B][/COLOR] number2[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        number3 [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در واقع ساختار زیر را به کدهای کلاس MyClass افزوده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]    [B]public[/B] MyClass [COLOR=#009900]([/COLOR]تعریف نام برای ورودی های کلاس و همچنین تعیین نوع آنها[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        محاسبات مورد نظرمان بر اساس ورودی های کلاس
    [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین چنانچه بخواهیم کدهای کلاس MyClass را در یک Activity اجرا کنیم، باید دو ورودی نیز برای کلاس MyClass تعیین کنیم. یعنی کدهایی مشابه کدهای زیر را در میان کدهای Activity می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کل کدهای Activity می تواند مشابه کدهای زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        [COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
        MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

   
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
روش دوم :

کدهای کلاس MyClass را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
        
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number3[COLOR=#339933];[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] Calculate [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] number1, [COLOR=#000066][B]int[/B][/COLOR] number2[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        number3 [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR]
        [B]return[/B] [COLOR=#CC66CC]1[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
دقت شود که برای برگرداندن مقدار به Activity ، خط زیر را نوشته ایم، اما در واقع، ظاهری است و چون همیشه مقدار 1 را برمی گرداند، عملا آن را از کلاس MyClass دریافت نخواهیم کرد (یعنی کدهای Activity را به گونه ای می نویسیم که آن را ذخیره نکنیم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]return[/B] [COLOR=#CC66CC]1[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون باید کدهای زیر را در میان کدهای Activity بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
myClass.[COLOR=#006633]Calculate[/COLOR][COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کل کدهای Activity می تواند مشابه کدهای زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        [COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
        MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        myClass.[COLOR=#006633]Calculate[/COLOR][COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

   
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
نوشتن کدهای کلاس (class)، در حالتی که یک یا چند خروجی را به Activity برمی گرداند :

در حالت هایی که تا اینجا مثال زدیم، کلاس MyClass ، هیچ خروجی را به Activity برنمی گرداند، اما گاهی نیاز داریم که یک یا چند مقدار را از کلاس ساخته شده دریافت کنیم تا ادامه کدهای Activity ، بر اساس آنها اجرا شوند. برای این منظور، می توانیم کدهای کلاس MyClass را به صورت زیر بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
        
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] number3[COLOR=#339933];[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] Calculate [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] number1, [COLOR=#000066][B]int[/B][/COLOR] number2[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        number3 [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR]
        [B]return[/B] number3[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
با عبارت زیر، مقدار number3 را به Activity بر می گردانیم (کلمه return را به خاطر بسپارید) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]return[/B] number3[COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون برای اینکه کدهای کلاس MyClass در Activity مورد نظرمان اجرا شوند و نتیجه را هم از کلاس MyClass دریافت کنیم، باید کدهای زیر را در میان کدهای Activity بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] myNumber3 [COLOR=#339933]=[/COLOR] myClass.[COLOR=#006633]Calculate[/COLOR][COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کل کدهای Activity می تواند مشابه کدهای زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        [COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
        MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]int[/B][/COLOR] myNumber3 [COLOR=#339933]=[/COLOR] myClass.[COLOR=#006633]Calculate[/COLOR][COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

   
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
برگرداندن بیش از یک خروجی، توسط کلاس (class) :

چنانچه بخواهیم که کلاس MyClass ، بیش از یک خروجی را به Activity برگرداند، کدهای کلاس MyClass می تواند به صورت زیر نوشته شود (برای حالت دو خروجی) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
        
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] numbers [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#000066][B]int[/B][/COLOR] [COLOR=#009900][[/COLOR][COLOR=#CC66CC]2[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] Calculate [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] number1, [COLOR=#000066][B]int[/B][/COLOR] number2[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        numbers[COLOR=#009900][[/COLOR][COLOR=#CC66CC]0[/COLOR][COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR]
        numbers[COLOR=#009900][[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]2[/COLOR][COLOR=#339933]*[/COLOR]number1[COLOR=#339933];[/COLOR]
        [B]return[/B] numbers[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
مشاهده می کنید که این بار، مقادیر را در یک آرایه از جنس int قرار داده ایم (تعداد عناصر آرایه حتما باید در همان ابتدای تعریف، مشخص شود).

برای دریافت دو مقدار (به صورت عناصر ذخیره شده در یک آرایه)، کدهای زیر را در میان کدهای Activity می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] myNumbers [COLOR=#339933]=[/COLOR] myClass.[COLOR=#006633]Calculate[/COLOR][COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کل کدهای Activity می تواند مشابه کدهای زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        [COLOR=#000066][B]int[/B][/COLOR] myNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]20[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]int[/B][/COLOR] myNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]30[/COLOR][COLOR=#339933];[/COLOR]
        MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] myNumbers [COLOR=#339933]=[/COLOR] myClass.[COLOR=#006633]Calculate[/COLOR][COLOR=#009900]([/COLOR]myNumber1, myNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

   
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
دریافت Context مربوط به Activity توسط کلاس (class)، برای مواردی که در کدها باید Activity شناسایی شود :

در برخی از کدها، باید Activity شناسایی شود تا کدها به صورت صحیح اجرا گردند. مثلا فرض کنید کدهای یک Activity به صورت زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Toast[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], [COLOR=#0000FF]"www.www.www.iran-eng.ir"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

   
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، کد زیر را نوشته ایم که برای نمایش یک پیام کوتاه به کاربر به کار می رود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], [COLOR=#0000FF]"www.www.www.iran-eng.ir"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اگر این خط از کدها را در یک کلاس (class) بنویسیم، دیگر نمی تواند با استفاده از عبارت MainActivity.this ، به Context متناظر با Activity دسترسی پیدا کند (آن را بشناسد)، بنابراین باید Context مربوط به Activity را به آن کلاس بفرستیم. بنابراین، کدهای کلاس MyClass را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Toast[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
        
    [B]private[/B] [COLOR=#003399]Context[/COLOR] context[COLOR=#339933];[/COLOR]
        
    [B]public[/B] MyClass [COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]this[/B].[COLOR=#006633]context[/COLOR] [COLOR=#339933]=[/COLOR] context[COLOR=#339933];[/COLOR]
        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B].[COLOR=#006633]context[/COLOR], [COLOR=#0000FF]"www.www.www.iran-eng.ir"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
کد زیر را باید در میان کدهای Activity بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
در کد بالا، کلمه this به Context مربوط به Activity اشاره می کند و بنابراین در حال ارسال Context مربوط به Activity به کلاس MyClass هستیم (ساخت یک شیء از کلاس MyClass).

کل کدهای Activity می تواند مشابه کدهای زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

   
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ساخت یک کلاس (class) جدید با قابلیت دریافت Context مربوط به Activity ، در برنامه نویسی اندروید

ساخت یک کلاس (class) جدید با قابلیت دریافت Context مربوط به Activity ، در برنامه نویسی اندروید

گاهی نیاز داریم که یک کلاس (class) جدید را به گونه ای تعریف کنیم که اگر در یک Activity از آن یک شیء (object) ساختیم، بتواند Context مربوط به Activity را دریافت کند. مثلا فرض کنید که بخواهیم یک کلاس (class) با نام MyClass بسازیم که از گسترش Application ساخته شود و هنگام ارجاع به آن در یک Activity ، بخواهیم Context مربوط به Activity را به آن ارسال کنیم، بنابراین باید ساختار آن کلاس (class) را به صورت کدهای زیر بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [B]class[/B] MyClass [B]extends[/B] Application [COLOR=#009900]{[/COLOR]
        
    [B]private[/B] [COLOR=#003399]Context[/COLOR] context[COLOR=#339933];[/COLOR]

    [B]public[/B] MyClass [COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]this[/B].[COLOR=#006633]context[/COLOR] [COLOR=#339933]=[/COLOR] context[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون برای ارسال Context مربوط به Activity ، به کلاس MyClass ، باید در میان کدهای Activity ، کدهای زیر را بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، از کلاس MyClass ، یک شیء (object) با نام myClass ساخته ایم و هنگام این فرآیند، Context مربوط به Activity را به کلاس ارسال کرده ایم (کلمه this به Context مربوط به Activity اشاره می کند).
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ساخت یک روش (Method) جدید در یک کلاس (Class)، در برنامه نویسی اندروید

ساخت یک روش (Method) جدید در یک کلاس (Class)، در برنامه نویسی اندروید

فرض کنید که یک کلاس با نام MyClass داریم که کدهای آن به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون فرض کنید که بخواهیم یک روش (method) جدید برای این کلاس (class) تعریف کنیم که دو عدد را دریافت کند و ضرب آن دو عدد را برگرداند، برای این منظور، باید کدهای زیر را در میان کدهای کلاس بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] Calculate [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] number1, [COLOR=#000066][B]int[/B][/COLOR] number2[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    [COLOR=#000066][B]int[/B][/COLOR] number3 [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR]
    [B]return[/B] number3[COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
یعنی کدهای کلاس MyClass به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] Calculate [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] number1, [COLOR=#000066][B]int[/B][/COLOR] number2[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#000066][B]int[/B][/COLOR] number3 [COLOR=#339933]=[/COLOR] number1[COLOR=#339933]*[/COLOR]number2[COLOR=#339933];[/COLOR]
        [B]return[/B] number3[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اگر بخواهیم در یک Activity دلخواه از برنامه اندروید، روش Calculate از کلاس MyClass را اجرا کنیم، باید کدهای زیر را در میان کدهای آن Activity بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]MyClass myClass [COLOR=#339933]=[/COLOR] [B]new[/B] MyClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] MyNumber1 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]2[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] MyNumber2 [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]3[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] MyNumber3 [COLOR=#339933]=[/COLOR] myClass.[COLOR=#006633]Calculate[/COLOR][COLOR=#009900]([/COLOR]MyNumber1, MyNumber2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
ساختار کلی یک روش (method) :

در واقع، ساختار کلی یک روش (method) به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Access_modifier return_type name_of_method [COLOR=#009900]([/COLOR]parameters[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    [COLOR=#666666][I]// operations to be performed;[/I][/COLOR]
    [B]return[/B] return_object[COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
به جای name_of_method ، باید نام مورد نظرمان برای روش (method) را بنویسیم. به جای return_type ، باید نوع متغیری (شیء) که تسط روش (method) برگردانده می شود را بنویسیم. به جای Access_modifier نیز باید یکی از موارد زیر نوشته شود که چگونگی دسترسی به روش (method) را مشخص می کند (تعیین دسترسی های مجاز) :
1- public
2- protected
3- Access_modifier عدم مشخص کردن (Default)
4- private


دقت شود که بعد از Access_modifier ، می توانیم یک non-access modifier را بنویسیم (یا می توان اصلا آن را ننوشت) که برای آن، مواردی مثل موارد زیر را داریم :
static و final و abstract و synchronized و native و volatile و transient و ...

یعنی مثلا برای public ، می توانیم حالت های زیر را داشته باشیم (با فرض اینکه static را انتخاب کرده باشیم) :
1- public
2- public static

همان طور که گفتیم، Access_modifier ، چگونگی دسترسی به روش (method) را تعیین می کند (تعیین Modifier برای روش)، این موضوع، در جدول زیر به طور کامل بیان شده است (کلمات بله و خیر، داشتن دسترسی به روش را برای هر یک از آن موارد مشخص کرده اند) :

WorldSubclassPackageClassModifier
بلهبلهبلهبلهpublic
خیربلهبلهبلهprotected
خیرخیربلهبلهبدون مشخص کردن Modifier
خیرخیرخیربلهprivate


به جای parameters ، باید ورودی های روش (method) و همچنین نوع آنها را بنویسیم (ابتدا نوع آنها نوشته می شود و سپس نامی که می خواهیم برای ورودی دریافت شده، قرار داده شود).

در آخر هم، به جای عبارت // operations to be performed; ، کدهای مورد نظرمان برای روش (method) را می نویسیم. return_object نام متناظر با متغیری (شیء) است که روش (method) برمی گرداند، بنابراین آن را باید بر طبق کدهای روش (method) تعیین کنیم.


نکته :


چنانچه روش (method) مورد نظر، هیچ مقداری را برنمی گرداند (دیگر کلمه return را نخواهیم داشت و روش، هیچ خروجی به ما نمی دهد)، در این صورت باید به جای return_type ، کلمه void را بنویسیم. یعنی مشابه کد زیر :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] Calculate [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] number1, [COLOR=#000066][B]int[/B][/COLOR] number2[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]// some code[/I][/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
نکته :

چنانچه روش (method)، هیچ ورودی دریافت نکند، باید پرانتز جلوی نام آن را به صورت خالی بگذاریم (نباید پرانتز حذف شود). یعنی مشابه کد زیر :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.com[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]junit.framework.TestCase[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MyClass [B]extends[/B] TestCase [COLOR=#009900]{[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] Calculate [COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]// some code[/I][/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
استفاده از یک متغیر از پیش تعریف شده، در یک کلاس (Class) یا یک روش (Method)، هنگامی که متغیر با روش متفاوتی تعریف شده باشد

استفاده از یک متغیر از پیش تعریف شده، در یک کلاس (Class) یا یک روش (Method)، هنگامی که متغیر با روش متفاوتی تعریف شده باشد

استفاده از یک متغیر از پیش تعریف شده، در یک کلاس (Class) یا یک روش (Method)، هنگامی که متغیر با روش متفاوتی تعریف شده باشد (راه حلی برای خطای Cannot refer to a non-final variable * inside an inner class defined in a different method)، در برنامه نویسی اندروید :


حتما تاکنون برایتان پیش آمده است که هنگامی که قصد داشته اید یک متغیر (از هر جنس دلخواه) را در یک کلاس (در واقع شیء ساخته شده از کلاس) یا یک روش (Method) به کار ببرید، با پیام خطای زیر در برنامه Eclipse روبرو شده اید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Cannot refer to a non[COLOR=#339933]-[/COLOR][B]final[/B] variable [COLOR=#339933]*[/COLOR] inside an inner [B]class[/B] defined in a different method[/FONT]
[/FONT][/COLOR]
در این مواقع نیز معمولا نمی توانیم ماهیت متغیر مورد نظرمان را تغییر بدهیم و همچنین چون نوع ورودی های کلاس (Class) یا روش (Method) نیز قبلا تعریف شده (کلاس ها و روش های استاندارد خود اندروید، مثلا setOnClickListener و CountDownTimer و ...)، نمی توانیم متغیر را به عنوان یک ورودی معمولی به کلاس یا روش مورد نظر ارسال کنیم. بنابراین با یک چالش برای استفاده از آن متغیر در کلاس یا روش مورد نظر، روبرو می شویم.

به عنوان مثال، کد زیر را ببینید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]new[/B] CountDownTimer[COLOR=#009900]([/COLOR][COLOR=#CC66CC]1000[/COLOR],[COLOR=#CC66CC]1000[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
    @Override
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onTick[COLOR=#009900]([/COLOR][COLOR=#000066][B]long[/B][/COLOR] millisUntilFinished[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR][COLOR=#009900]}[/COLOR] 

    @Override
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onFinish[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]// your code[/I][/COLOR]
        result.[COLOR=#006633]setVisibility[/COLOR][COLOR=#009900]([/COLOR][COLOR=#003399]View[/COLOR].[COLOR=#006633]VISIBLE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR].[COLOR=#006633]start[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
در کد بالا، متغیر result از جنس View می باشد و قبل از این کدها، تعریف شده است. با نوشتن کد فوق، با خطای مورد نظر روبرو می شویم (خطا برای متغیر result نمایش داده می شود و ذکر شده که نمی توانیم به آن در این خط از کدها ارجاع بدهیم) :

1496.jpg



1497.jpg

راه حلی که می توانیم برای این مواقع به کار ببریم، گسترش (extends) کلاس مورد نظر است و سپس در کلاس جدیدی که بر اساس گسترش آن کلاس قبلی (که یک کلاس استاندارد اندروید است) ساخته ایم، یک ورودی جدید از نوع View هم تعریف می کنیم. یعنی کلاس جدید را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [B]class[/B] MyCountDownTimer [B]extends[/B] CountDownTimer[COLOR=#009900]{[/COLOR]
        [COLOR=#003399]View[/COLOR] myView[COLOR=#339933];[/COLOR]

        [B]public[/B] MyCountDownTimer[COLOR=#009900]([/COLOR][COLOR=#000066][B]long[/B][/COLOR] millisInFuture, [COLOR=#000066][B]long[/B][/COLOR] countDownInterval, [COLOR=#003399]View[/COLOR] view[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B][COLOR=#009900]([/COLOR]millisInFuture, countDownInterval[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]this[/B].[COLOR=#006633]myView[/COLOR] [COLOR=#339933]=[/COLOR] view[COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        @Override
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onTick[COLOR=#009900]([/COLOR][COLOR=#000066][B]long[/B][/COLOR] millisUntilFinished[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#009900]}[/COLOR]

        @Override
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onFinish[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                myView.[COLOR=#006633]setVisibility[/COLOR][COLOR=#009900]([/COLOR][COLOR=#003399]View[/COLOR].[COLOR=#006633]VISIBLE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
مشاهده می کنید که یک ورودی جدید از جنس View اضافه کرده ایم (کلاس استاندارد CountDownTimer خودش تنها دو ورودی دریافت می کند) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] MyCountDownTimer[COLOR=#009900]([/COLOR][COLOR=#000066][B]long[/B][/COLOR] millisInFuture, [COLOR=#000066][B]long[/B][/COLOR] countDownInterval, [COLOR=#003399]View[/COLOR] view[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR][/FONT]
[/FONT][/COLOR]
همچنین در کد مورد نظر، این خط نیز مهم است که در آن، یک متغیر از جنس View و با نام myView تعریف کرده ایم که در کل کلاس به کار می رود (مقدار result که به کلاس ارسال می کنیم، در این متغیر ذخیره شده و مورد استفاده قرار می گیرد) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]this[/B].[COLOR=#006633]myView[/COLOR] [COLOR=#339933]=[/COLOR] view[COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون تنها کافی است که به جای کد قبلی، این کد را بر اساس کلاس جدید MyCountDownTimer اجرا کنیم (متغیر result را به عنوان ورودی به آن داده ایم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]MyCountDownTimer myCountDownTimer [COLOR=#339933]=[/COLOR] [B]new[/B] MyCountDownTimer[COLOR=#009900]([/COLOR][COLOR=#CC66CC]1000[/COLOR], [COLOR=#CC66CC]1000[/COLOR], result[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
myCountDownTimer.[COLOR=#006633]start[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین دیگر با خطای مورد نظر روبرو نخواهیم شد.

اگر نمی دانید که چگونه کلاس های استاندارد اندروید را گسترش (extends) بدهید، بهتر است که به دنبال کدهای نمونه در اینترنت جستجو کنید (اگر کلاس مورد نظر را خودتان نوشته باشید که دیگر به تمامی کدهای آن دسترسی دارید و تغییر ساختار آن ساده است).
 

الناز تبریز

کاربر بیش فعال
کاربر ممتاز
خیلی خیلی ممنون از توضیحات خوبتون. حیفم اومد چیزی نگم. بابت همه مطالبتون تشکر میکنم.
 
بالا