Một ví dụ về đa hình trog Java ( còn cập nhật )
Wednesday, January 14, 2009 3:44:19 PM
{
public void saySomething();
}
//+++++++++++ DOG +++++++++++++++
public class Dog implements Animal
{
public void saySomething()
{
System.out.println("I am a dog");
}
}
FROM: http://www.javavietnam.org/javavn/mvnforum/viewthread?thread=4512
//++++++++++++ CAT +++++++++++++++
public class Cat implements Animal
{
public void saySomething()
{
System.out.println("I am a cat");
}
}
Animal a = new Dog();
a.saySomething(); //output: I am a dog
a = new Cat();
a.saySomething(); // output: I am a cat
Như bạn thấy ở trong ví dụ trên tham chiếu tới Dog, hay tới Cat đều được trả về cho một Animal, tôi ngụ ý rằng đó là một con thú mà không cần biết là Dog hay Cat. Khi gọi phương thức saySomething(), Java biết chính xác phương thức saySomething() của lớp nào sẽ được gọi, đó chính là đặc trưng của polimorphism. Còn việc Java làm thế nào để nhận biết được điều đó thì nằm trong máy ảo.
Để hiểu rõ hơn về Polimorphism bạn đọc chương bắt đầu của cuốn Thinking in Java, khá hay và khá lý thú đấy.
FROM: http://www.javavietnam.org/javavn/mvnforum/viewthread?thread=4512












Dung L.T.Nobita2708 # Wednesday, January 14, 2009 3:50:38 PM
FROM: http://www.javavietnam.org/javavn/mvnforum/viewthread?thread=4512
Dung L.T.Nobita2708 # Wednesday, January 14, 2009 3:59:46 PM
FROM: http://www.javavietnam.org/javavn/mvnforum/viewthread?thread=4512
Dung L.T.Nobita2708 # Wednesday, January 14, 2009 4:20:50 PM
Trong pascal hay c khi bạn tạo ra 1 function
int loadTape (int c); thì bạn chỉ có thể chỉ gọi loadTape với dũ liệu loại int mà thôi. nếu bạn tạo 1 function khác loadTape (char c) thì program sẻ báo lổi khi biên dịch (compile) ngay lập tức.
Trong ngôn ngữ OO, có polymorphism. Khi bạn khởi tạo 1 object VCR chẳng hạn, thì bạn có thể tạo ra được nhiều method (function)
int loadTape (int c) {cout << c; }
int loadTape (char c) { cout << c; }
int loadTape (bool c) { cout << c; }
int loadTape (float c) { cout << c; }
int loadTape (double c) {cout << c; }
....
Sau khi bạn hoàn thành object VCR này, bạn có thể bảo người khác sử dụng nó 1 các rất dể dàng như sau
VCR daumay = new VCR ();
loadTape (10);
loadTape ('A');
loadTape (true);
loadTape (1.5);
FROM: http://www.javavietnam.org/javavn/mvnforum/viewthread?thread=4512
Dung L.T.Nobita2708 # Thursday, January 15, 2009 5:54:19 AM
Polymorphism (P) và Encapsulation (E) có quan hệ mật thiết, bổ sung với nhau.
P có 2 loại: static và dynamic
Cái này của bác Tinman là static P: dựa trên cơ chế function overloading, các funtionc có thể cùng tên nhưng khác function signature (khác số tham số, kiểu, ...) là có thể overloading.
////////////////////////////////////////////////////////////////////////
Polymorphism: Không biết tiếng việt dịch ra là gì. Lấy ví dụ dơn giản nhất là dùng đầu máy VCR nghe. Đầu máy đa hệ thì giống như 1 ngôn ngữ có polymorphism. còn đưa cuốn băng vào thì là 1 function call trong ngôn ngữ đó. Với đầu máy 1 hệ thì chỉ có 1 function mà thôi. Bạn phải dùng đúng loại băng. Nếu máy hệ NTSC thì chỉ được bỏ băng NTSC, còn hệ PAL thì chỉ bỏ được băng hệ PAL. Còn đầu máy đa hệ thì bạn chỉ cần bỏ đại vào 1 cuốn băng hệ NTSC hay PAL hay SECAM, đầu máy sẻ tự nó biết để chạy đúng chương trình đọc băng đó.
Trong pascal hay c khi bạn tạo ra 1 function
int loadTape (int c); thì bạn chỉ có thể chỉ gọi loadTape với dũ liệu loại int mà thôi. nếu bạn tạo 1 function khác loadTape (char c) thì program sẻ báo lổi khi biên dịch (compile) ngay lập tức.
Trong ngôn ngữ OO, có polymorphism. Khi bạn khởi tạo 1 object VCR chẳng hạn, thì bạn có thể tạo ra được nhiều method (function)
int loadTape (int c) {cout << c; }
int loadTape (char c) { cout << c; }
int loadTape (bool c) { cout << c; }
int loadTape (float c) { cout << c; }
int loadTape (double c) {cout << c; }
....
Sau khi bạn hoàn thành object VCR này, bạn có thể bảo người khác sử dụng nó 1 các rất dể dàng như sau
VCR daumay = new VCR ();
loadTape (10);
loadTape ('A');
loadTape (true);
loadTape (1.5);
....
thì các phuong thức (method) của bạn sẻ được sữ dụng với bắt kỳ loại dủ liệu nào mà chương trình bạn cho phép. Nhìn vào command 'cout' ở trên, bạn thấy nó cũng in ra được bắt kỳ loại dữ liệu nào. cout cũng là 1 method sữ dụng polymorphism với các loại dữ liệu khác nhau.
Tuy nhiên nếu chúng ta sử dụng 1 array
int carray [100];
rồi dùng loadTape (carray); thì chương trình sẻ báo lổi vì nó sẻ không biết làm sao để xử lý carray. Trở lại các đầu máy cũng vậy, nếu ngày mai lại có 1 chuẩn mới về băng video ra đời gọi là XYZ, bạn cho cuốn băng này vào đầu máy đa hệ cũ của bạn thì chắc chắn nó sẻ không chạy được. Vì vậy polymorphism chỉ có thể hỗ trợ đa dạng dữ liệu nhưng các dữ liệu và phương thức (method) đó phãi được khai báo trước.
///////////////////////////////////////////////////////
Còn cái này của bác Sonngoc la dynamic P: dựa trên cơ chế late binding
///////////////////////////////////////////////////////
Ví dụ thế này:
public interface Animal
{
public void saySomething();
}
//+++++++++++ DOG +++++++++++++++
public class Dog implements Animal
{
public void saySomething()
{
System.out.println("I am a dog");
}
}
//++++++++++++ CAT +++++++++++++++
public class Cat implements Animal
{
public void saySomething()
{
System.out.println("I am a cat");
}
}
Animal a = new Dog();
a.saySomething(); //output: I am a dog
a = new Cat();
a.saySomething(); // output: I am a cat
Như bạn thấy ở trong ví dụ trên tham chiếu tới Dog, hay tới Cat đều được trả về cho một Animal, tôi ngụ ý rằng đó là một con thú mà không cần biết là Dog hay Cat. Khi gọi phương thức saySomething(), Java biết chính xác phương thức saySomething() của lớp nào sẽ được gọi, đó chính là đặc trưng của polimorphism. Còn việc Java làm thế nào để nhận biết được điều đó thì nằm trong máy ảo.
Để hiểu rõ hơn về Polimorphism bạn đọc chương bắt đầu của cuốn Thinking in Java, khá hay và khá lý thú đấy.
Thân!
///////////////////////////////////////////////////////////////
Còn cái này của bác tinman là Encapsulation:
///////////////////////////////////////////////////////////////
Trong sách này có 1 ví dụ vè polymorphism rất dể hiểu: có thể ví như vô lăng (tay lái) của 1 chiếc xe hơi, nó cho người sử dụng 1 chức năng duy nhất là là điều khiển chiếc xe. Người sử dụng chỉ cần biết bẻ qua trái thì xe sẻ quẹo trái, bẻ qua phải thì xe sẻ quẹo phải. Còn làm sao từng loại xe, dùng nhửng cơ cấu truyền động và điều khiển nào để quẹo, người sử dụng không cần biến đến. (Vì dụ này hay hơn cái ví dụ đầu máy ở trên của mình gấp 100%) Mình không giỏi về lý thuyết, chỉ hiểu bằng hình tượng, khi đụng chuyện thì lấy đại 1 cái theo nguyên tắc chính đó mà nói ra thôi.
///////////////////////////////////////////////////////////////
Nói chung Polymorphism có thể hiểu nôm na là 1 đối tượng có thể có nhiều hình thái khác nhau tuỳ thuộc vào yêu cầu và ngữ cảnh sử dụng nó.
Còn Encapsulation là tính bao hàm hay tính đóng gói, tuỳ vào đối tượng sử dụng quan tâm đến những gì của đối tượng. Vd: Cái máy giặt, nếu là người dùng để giặt thì sẽ quan tâm đến chức năng "giặt", "sấy", ... mà không cần biết bên trong nó làm những gì, còn nếu là người thợ sửa máy thì sẽ quan tâm đến hoạt động bên trong của máy.
FROM: http://www.javavietnam.org/javavn/mvnforum/viewthread_thread,4512_offset,10