PDA

View Full Version : اطلاعاتی در مورد Anonymous Class می خواستم



nedata
یک شنبه 05 اسفند 1386, 22:23 عصر
سلام
اطلاعاتی در مورد Anonymous Class می خواستم. اطلاعاتی مانند کاربرد و دلیل استفاده و مزیت آنها
ممنون

javaphantom
دوشنبه 06 اسفند 1386, 00:04 صبح
اگر مفهوم inner class هارو خوب متوجه شده باشید مفهوم Anonymous class هم سادست
یک مثال ساده برای event handling مثل بستن JFrame
اما برای اینکه با شکل و فرم یک inner class هم آشنا بشید اول یک مثال از inner class بعد Anonymous Class و در آخر مقایسه این دو

سوال: یک کلاس به همراه یک کلاس داخلی یا همان inner class چگونه صدا کنیم inner class را؟



public class MyInnerClass {

private int a = 10;

public class InnerClass {
public void inner() {
System.out.println(a);
}
}

public static void main(String[] s) {

MyInnerClass myInnerClass = new MyInnerClass();
MyInnerClass.InnerClass innerClass = myInnerClass.new InnerClass();
innerClass.inner();
}
}

در کد نوشته شده بالا یک کلاس تعریف شده که در داخل آن یک کلاس دیگر تعریف شده.
نکته در innerclass می توان به فیلدها یا متدود های کلاس بالاتر که بصورت private هستند دسترسی داشته باشیم در این مثال int a از نوع private هستند ولی به راحتی از کلاس inner که همان کلاس InnerClass هست به آن دسترسی داریم.
دقیقا مانند friend در C++ عمل می کند.
در هنگام ارث بری کلاسی که از کلاس super ارث بگیرد به Inner Class دسترسی دارد.
طرز دسترسی به inner class هم که در method main نشان داده شده است.

اما Anonymous classچسیت؟ مانند کلاس های inner ولی بدون اسم به مثال زیر توجه کنید.


import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class MyFrame extends JFrame {

public MyFrame() {
this.setBounds(new Rectangle(200,200));
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public static void main(String[] s) {

new MyFrame();
}
}

در این مثال ساده که مشاهده می کنید همانطور که در بالا اشاره کردم یک event ساده handle شده است. در این تیکه کد هم از دو کلاس استفاده شده اما با این تفاوت که کلاس دوم نام نداره یعنی همان Anonymous class که مشاهده می کنید. از طریق adapter pattern این event رو من Handle کردم. یعنی از کلاس WindowAdapter که همان کلاس inner به حساب می آید یکی از method های اون رو که همان public void windowClosing هست رو override کردم.
در صورتی که نمی خواستم از این روش این event رو handle کنم باید از pattern ی به نام composite استفاده می کردم که اگر کسی علاقه داشته باشه در مورد pattern ها بعدا صحبت می کنم و این کار دردسر بیشتری داشت.
این نوع کلاس صدا زدن همان چیزی هست که شما دنبالش می گردید. سوال داشتید در خدمتم
چاکس

nedata
سه شنبه 07 اسفند 1386, 23:00 عصر
ممنون از کمک و راهنماییتون