PDA

View Full Version : ورودی های متد



hosseinaryai
سه شنبه 09 تیر 1394, 09:19 صبح
با درود
دوستان کل سوال توی این جملست : آیا ورودی یک متد ، می تونه متد دیگه ای باشه ؟
مثال می زنم :
فرض می کنیم من توی کلاس جدایی (HSH) یه مدت بصورت استاتیک تعریف کردم تا کارم توی کد نویسی هام راحت تر بشه ، بصورت زیر :



public static void dial(Context c,String title,String t1,String t2){
AlertDialog.Builder al = new AlertDialog.Builder(c);
al.setTitle(title);
al.setPositiveButton(t1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});
al.setNegativeButton(t2, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});
al.show();
}


خب تا اینجاش مشکلی نیست ،می تونم اینو توی یه کلاس دیگه فراخونی کنم ، اما مشکل از جایی شروع میشه میشه که مثلن آلرت دیالوگ دوتا دکمه داره که هر کدوم باید یه کاری انجام بدن و من کارهای این دو تا دکمه رو می خوام بصورت متد به عنوان ورودی (مثلن همون title و ..) به متد نسبت بدم ..
می دونم می تونم توی همون کلاس دوم ، دوتا متد سراسری تعریف کنم و اینجا معرفیش کنم ، اما می خوام این کلاس HSH من جامع باشه و توی هر برنامه ی دیگه ای ازش استفاده کنم
این تا اینجا ..
یکم گشتم دیدم متد ورودی کلاسو قبول می کنه ، مثلن در ادامه ی ورودی های این کلاس بنویسم Class myclss ، همه چیز درست پیش میره ..
و می تونم توی رویداد هر دکمه ای بصورت زیر بنویسم :



myclass.getMethod("onPOSITIV",void.class);

و

myclass.getMethod("onNEGATIV",void.class);


بعد حالا توی هر کلاسی که می خوام اینو فراخوانی کنم ، دوتا متد با نام هایی که بالا تعریف کردم بنویسم و توش کد بذارم ..
اما هیچ اتفاقی در رویداد کلیک دکمه نمی افته .. اصلن راهو دارم درست میرم ؟ می تونم به این روش به رویداد کلیک متد معرفی کنم ؟

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

tux-world
سه شنبه 09 تیر 1394, 16:35 عصر
بلی میتونه باشه شما دارید اشتباه مقدار دهی میکنید. سوای اینکه کلن تحلیلی که برای این کاری که کردید اشتباه هستش و کلن شی گرایی رو زیر سوال میبره
ولی به صورت زیر میتونی کلاس رو به عنوان پارامتر پاس بدی. مثال:

public boolean clearDatabaseTable(Class<?> className) {
}

ولی بهتره از خاصیت chain تو کلاس به صورت زنجیره ای استفاده کنی. مثال:

Clasname().addOkButton().addCancleButton().show()

Nevercom
سه شنبه 09 تیر 1394, 18:37 عصر
اگه به متد setPositiveButton یا setNegativeButton نگاه کنید میبینید که چیزی که دنبالش هستید به نوعی پیاده سازی شده.
درواقع پارامتر دوم یک Interface هست، که وقتی روی دکمه کلیک شد متد onClick اون فراخوانی میشه و در نتیحه کدی که در Dialog و در متد OnClick نوشتید، اجرا میشه.

شما هم از الگوی مشابهی استفاده کنید، یک Interface تعریف کنید و اون رو به متدتون پاس بدید و هنگامی که کلیک رخ داد، متد موجود در اون اینترفیس رو صدا بزنید. در این حالت کلاسی که اینترفیس رو Implement کرده و درواقع این شئ رو ارسال کرده متوجه میشه که کلیک صورت گرفته.

مثلاً یک اینترفیس به این شکل تعریف کنید.:


public interface OnBuutonClicked {
void onClick(int type);
}


حالا یه پارامتر به متد dial اضافه کنید از جنس OnButtonClicked

public static void dial(Context c, String title, String t1, String t2, final OnButtonClicked listener) { AlertDialog.Builder al = new AlertDialog.Builder(c);
al.setTitle(title);
al.setPositiveButton(t1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
listener.onClick(1);
}
});
al.setNegativeButton(t2, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
listener.onClick(2);
}
});
al.show();
}

روش صدا زدن هم میتونه به این شکل باشه:
OnButtonClicked callback = new OnButtonClicked(){ @Override
public void onClick(int type){
// Do something here
}
}
ThatClass.dial(this, "title", "t1 text", "t2 text", callback);

hosseinaryai
چهارشنبه 10 تیر 1394, 07:47 صبح
بلی میتونه باشه شما دارید اشتباه مقدار دهی میکنید. سوای اینکه کلن تحلیلی که برای این کاری که کردید اشتباه هستش و کلن شی گرایی رو زیر سوال میبره
ولی به صورت زیر میتونی کلاس رو به عنوان پارامتر پاس بدی. مثال:

public boolean clearDatabaseTable(Class<?> className) {
}

ولی بهتره از خاصیت chain تو کلاس به صورت زنجیره ای استفاده کنی. مثال:

Clasname().addOkButton().addCancleButton().show()

ممنونم از اینکه وقت گذاشتی و جواب دادی .. اما راستش اما راستش این chain نحوه ی کاربردشو متوجه نشدم

hosseinaryai
چهارشنبه 10 تیر 1394, 07:47 صبح
اگه به متد setPositiveButton یا setNegativeButton نگاه کنید میبینید که چیزی که دنبالش هستید به نوعی پیاده سازی شده.
درواقع پارامتر دوم یک Interface هست، که وقتی روی دکمه کلیک شد متد onClick اون فراخوانی میشه و در نتیحه کدی که در Dialog و در متد OnClick نوشتید، اجرا میشه.

شما هم از الگوی مشابهی استفاده کنید، یک Interface تعریف کنید و اون رو به متدتون پاس بدید و هنگامی که کلیک رخ داد، متد موجود در اون اینترفیس رو صدا بزنید. در این حالت کلاسی که اینترفیس رو Implement کرده و درواقع این شئ رو ارسال کرده متوجه میشه که کلیک صورت گرفته.

مثلاً یک اینترفیس به این شکل تعریف کنید.:


public interface OnBuutonClicked {
void onClick(int type);
}


حالا یه پارامتر به متد dial اضافه کنید از جنس OnButtonClicked

public static void dial(Context c, String title, String t1, String t2, final OnButtonClicked listener) { AlertDialog.Builder al = new AlertDialog.Builder(c);
al.setTitle(title);
al.setPositiveButton(t1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
listener.onClick(1);
}
});
al.setNegativeButton(t2, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
listener.onClick(2);
}
});
al.show();
}

روش صدا زدن هم میتونه به این شکل باشه:
OnButtonClicked callback = new OnButtonClicked(){ @Override
public void onClick(int type){
// Do something here
}
}
ThatClass.dial(this, "title", "t1 text", "t2 text", callback);

ممنونم دوست من ، کلن فهمیدم موضوع چیه :قلب:

tux-world
چهارشنبه 10 تیر 1394, 11:50 صبح
زنجیره به توابع پشت سرهم که میان میگن. یه کلاس والد میشه با فرزنداش که میشن توابعش. مثل مثالی که زدم.