View Full Version : مبتدی: واسط ها
قله بلند
یک شنبه 29 آذر 1388, 17:06 عصر
سلام
خیلی دوست داشتم سوالم رو در ادامه تاپیک دلیل استفاده از Interface و Abstract مطرح کنم ولی متاسفانه به سوالی که در پست آخر این تاپیک نیز پرسیده ام پاسخی داده نشد. نمی دانم شاید دیده نمی شود یا دیگر کسی تمایلی به پاسخ دادن به آن تاپیک را ندارد. به همین خاطر مجبور شدم که یک تاپیک مجزا برای سوالم باز کنم.
اگر به پست 10 از تاپیک مذکور نگاهی بیاندازید، مثالی ساده از کاربرد واسط آمده است.
interface Animals {void talk();void walk();}در اینجا، توابعی که در واسط هستند، همگی تابعی معمولی می باشند. حال اگر فرض کنیم به جای تابع دوم بخواهیم شیئی را ارسال کنیم:
interface Animals {void talk();Animals walk();}حالا در کلاسی که این واسط را اجرا می کند چگونه شیء ارسال می شود؟
class Human implements Animals {
public void talk() {
System.out.println("like a human");
}
public Animals walk() {
?
}به جای علامت سوال چه باید نوشت؟
cups_of_java
یک شنبه 29 آذر 1388, 19:02 عصر
اولن شما چیزی ارسال نمی کنید. دارید نوع برگشتی برای متد تعریف می کنید. زمانی که نوع برگشتی از جنس یک واسط باشه زمان پیاده سازی اون متد باید یکی از زیر کلاس های اون واسط برگرده. مثلن Human برگرده.
این کار اتفاقن خیلی زیاد انجام میشه چون انعطاف و قدرت بالایی داره. این متد ها، در مقدار برگشتی به صورت چند ریخت عمل می کنن دیگه!
قله بلند
دوشنبه 30 آذر 1388, 00:32 صبح
interface Animals
{
void talk();
Animals walk();
}
class Human implements Animals
{
public void talk()
{
System.out.println("like a human");
}
public Animals walk()
{
Human ob=new Human();
return ob;
}
}
public class Use
{
public static void main(String args[])
{
Animals human = new Human();
Animals human1;
human1=human.walk();
human.talk();
human1.talk();
}
}اولاً ممنونم. با راهنمایی شما تونستم مساله رو حل کنم.
ثانیاً اینگونه فرستادن شیء، برای واسطها و کلاس های مجرد است. چون از اینها که نمی شود نمونه ساخت. لطفاً کمی بیشتر توضیح دهید.
این کار اتفاقن خیلی زیاد انجام میشه چون انعطاف و قدرت بالایی داره. این متد ها، در مقدار برگشتی به صورت چند ریخت عمل می کنن دیگه!
cups_of_java
دوشنبه 30 آذر 1388, 13:21 عصر
این پیاده سازی های اون واسط هستند که نمونه هاشون ساخته میشه و به جای خود واسط (Interface) برگردونده میشن.
قله بلند
دوشنبه 30 آذر 1388, 15:16 عصر
فرض کنید تابعی از درجه دوم داریم، مثلاً X2 +2 که مشتقش می شود 2x
برنامه زیر حاوی یک واسط و یک کلاس است. این کلاس، سازنده ای دارد که ضرایب دو جمله ای را مقداردهی می کند و تعریف دو تابعی که در واسط قرار دارند. تابع اول قرار است مقدار x=3 را دریافت کند و مقدار 11 را برگرداند و تابع دوم نیز قرار است، مشتق تابع اصلی را با x=3 حساب کرده و برگرداند. همه چیز درست است و برنامه به درستی کار می کند.
interface MathFunc
{
double evaluate(double x);
MathFunc derivative();
}
class Polynomial implements MathFunc
{
double c[]={0,0,0};
Polynomial(double ct[])
{
c[2]=ct[2];c[1]=ct[1];c[0]=ct[0];
}
public double evaluate(double x)
{
double temp=((Math.pow(x,2))*c[2])+((Math.pow(x,1))*c[1])+c[0];
return temp;
}
public MathFunc derivative()
{
double ctemp[]={0,2,0};
Polynomial ob=new Polynomial(ctemp);
return ob;
}
}
public class Test1
{
public static void main(String args[])
{
double c[]={2,0,1};
Polynomial p=new Polynomial(c);
System.out.println(p.evaluate(3));//result=11
System.out.println(p.derivative().evaluate(3));//result=6
}
}سوال: فرض کنید قرار است کلاس دیگری به این برنامه اضافه شود که مانند کلاس قبلی، واسط را اجرا کند با این تفاوت که جمع دو تابع را برگرداند. یعنی X2 +2+2x که به ازای x=3 باید مقدار 17 را برگرداند. این کلاس نیز سازنده ای دارد و پارامترهای آن، دو تابع یاد شده هستند. هرچقدر فکر کردم نتوانستم چنین سازنده ای بسازم. از طرفی پارامترهای این سازنده باید چیزی را مقداردهی کنند، آنها چه می توانند باشند؟ ضرایب دو جمله ای چگونه منتقل می شوند؟ واقعاً حیران و سرگردان شده ام.
قله بلند
سه شنبه 01 دی 1388, 16:47 عصر
سلام.خواهش می کنم یک راهنمایی بفرمایید. شاید قفل مغزم باز بشه و راه حل رو پیدا کنم. هر چی فکر می کنم به جایی نمی رسم.
cups_of_java
سه شنبه 01 دی 1388, 17:49 عصر
سلام.خواهش می کنم یک راهنمایی بفرمایید. شاید قفل مغزم باز بشه و راه حل رو پیدا کنم. هر چی فکر می کنم به جایی نمی رسم.
یه زره شی گرا فکر کن...
مگه قرار نیست بر اساس اون واسط یک تابع رباضی جمع کننده بنویسی؟ خب بیا:
class Adder implements MathFunc
خب سازندشم قراره دوتا تابع بگیره که جمعشون کنه دیگه:
public Adder( MathFunc f1, MathFunc f2 )
حالا پیاده سازی دو تا متد واسط برای Adder،
برای برگردوندن جمع در متد evaluate:
double evaluate( double x ) {
return f1.evaluate(x) + f2.evaluate(x);
}
حالا متد دوم رو خودت می تونی پیاده سازی کنی و کد رو کامل کنی.
قله بلند
چهارشنبه 02 دی 1388, 00:05 صبح
سلام
قسمت دوم قطعه کد پست پنجم رو هم به جواب رسوندم. ممنونم از راهنمایی شما.
class AddFunc implements MathFunc
{
MathFunc f,g;
AddFunc (MathFunc a,MathFunc b)
{
f=a;g=b;
}
public double evaluate(double x)
{
double temp=f.evaluate(x)+g.evaluate(x);
return temp;
}
public MathFunc derivative()
{
double cf[]={0,2,0};
Polynomial f=new Polynomial(cf);
double cg[]={2,0,0};
Polynomial g=new Polynomial(cg);
AddFunc ob=new AddFunc(f,g);
return ob;
}
}
public class Test1
{
public static void main(String args[])
{
AddFunc a=new AddFunc(p,p.derivative());
System.out.println(a.evaluate(3));
System.out.println(a.derivative().evaluate(3));
}
}
حالا یه خواهشی دارم. می شه یک مساله برام طرح کنید که مثل این باشه. یعنی واسط داشته باشه و اینجوری آدم رو درگیر کنه. حدوداً دو روزه درگیره حلش شدم و نکته های قشنگی یاد گرفتم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.