• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Đa hình là gì ? có bao nhiêu cách implement đa hình ?

Nơi trao đổi, hỏi đáp về hướng đối tượng (OOP - Object-Oriented Programming), không giới hạn về ngôn ngữ lập trình
HaiPT
VIP
VIP
Bài viết: 252
Ngày tham gia: T.Tư 07/09/2005 4:02 pm
Đến từ: Hải Phòng
Has thanked: 1 time
Been thanked: 12 time
Liên hệ:

Đa hình là gì ? có bao nhiêu cách implement đa hình ?

Gửi bàigửi bởi HaiPT » T.Hai 09/01/2012 3:23 pm

;)) Mời


Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

huynguyen
Thành viên chính thức
Thành viên chính thức
Bài viết: 16
Ngày tham gia: T.Hai 31/03/2008 9:32 pm

Re: Đa hình là gì ? có bao nhiêu cách implement đa hình ?

Gửi bàigửi bởi huynguyen » T.Tư 11/01/2012 10:12 pm

Đa hình được chia ra làm 2 nhóm chính là static và dynamic, trong static lại chia ra làm 2 loại là overloading method va overloading operator, trong dynamic được chia ra làm 2 loại là virtual method và abstract method. Theo sách vở là thế này, ko biết ý kiến bác Hải như thế nào :D

FlyingFox
Guru
Guru
Bài viết: 811
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 322 time

Re: Đa hình là gì ? có bao nhiêu cách implement đa hình ?

Gửi bàigửi bởi FlyingFox » T.Năm 12/01/2012 6:24 am

Xin tạm dùng định nghĩa cũa Lập trình hướng đối tượng cũa Viet Wikipedia http://vi.wikipedia.org/wiki/Lập_trình_hướng_đối_tượng đễ trã lời câu hõi trên.

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: Đa hình là gì ? có bao nhiêu cách implement đa hình ?

Gửi bàigửi bởi alexanderdna » T.Năm 12/01/2012 8:50 am

Hiểu sao nói vậy nha anh.

Đa hình, tức polymorphism, là một trong các đặc điểm cốt lõi của OOP. Nó giúp cho các đối tượng thuộc kiểu khác nhau thực hiện những hành vi đặc trưng (và khác biệt) của chúng trong khi được truyền cùng một thông điệp.

Nói đơn giản hơn, khi gọi cùng một phương thức hay truy cập cùng một thuộc tính, thì mỗi đối tượng sẽ có một cách đáp ứng riêng biệt.


Để khai triển tính chất đa hình, có một số cách sau đây (chưa chắc đầy đủ):
- Định nghĩa bội, tức overloading. Một phương thức, hay toán tử, có thể có nhiều phiên bản khác nhau, ứng với số lượng và kiểu khác nhau của các tham số.
Ví dụ, ta có lớp Graphics với phương thức Draw có các phiên bản Draw(Circle c), Draw(Rectangle r), Draw(Triangle t).

- Tái định nghĩa, tức overriding. Một phương thức, toán tử hay thuộc tính ở lớp cơ sở (hoặc giao diện - interface) có thể được định nghĩa lại ở các lớp dẫn xuất (hoặc lớp khai triển - implementing class). Mà từng lớp dẫn xuất có thể có cách riêng để định nghĩa thành phần ấy.
Ví dụ, ta có hai đối tượng a và b thuộc lớp Triangle và Rectangle, cùng kế thừa từ lớp Shape (hay giao diện IShape) có phương thức GetPerimeter(). Tuy nhiên, a và b có cách khác nhau, hay là giải thuật khác nhau, để thực hiện phương thức GetPerimeter.


Có gì sai sót, xin chỉ bảo thêm. :)

HaiPT
VIP
VIP
Bài viết: 252
Ngày tham gia: T.Tư 07/09/2005 4:02 pm
Đến từ: Hải Phòng
Has thanked: 1 time
Been thanked: 12 time
Liên hệ:

Re: Đa hình là gì ? có bao nhiêu cách implement đa hình ?

Gửi bàigửi bởi HaiPT » T.Ba 17/01/2012 3:07 pm

Phần định nghĩa thì alex trả lời khá rõ ràng, tuy nhiên về cách triển khai đa hình thì mình bổ sung thêm như sau
Có ba cách triển khai đa hình :
(1) - overloading
+ Thực ra overload rất khó được coi là đa hình :) , vì một khi các function có cùng tên nhưng khác về parameter .. thì cũng coi như là 2 cái tên riêng biệt rồi!
Tuy nhiên tuân theo định nghĩa thì cứ tạm coi đó là đa hình nhưng "yếu" ! overloading là 1 features mới của OOP so với lập trình hướng cấu trục ,chủ yếu làm code tiện hơn :)
(2) Overide
Ví dụ :
  1. using System;
  2. namespace OOP.Demo
  3. {
  4.     class Program
  5.     {
  6.         private static void Main()
  7.         {
  8.             Animal animal;
  9.             animal = new Tiger();
  10.             animal.Run();
  11.             animal = new Dog();
  12.             animal.Run();
  13.             Console.ReadLine();
  14.         }
  15.         public abstract class Animal
  16.         {
  17.             public abstract void Run();
  18.         }
  19.  
  20.         public class Dog : Animal
  21.         {
  22.             public override void Run()
  23.             {
  24.                 Console.WriteLine("Dog run");
  25.             }
  26.         }
  27.         public class Tiger : Animal
  28.         {
  29.             public override void Run()
  30.             {
  31.                 Console.WriteLine("Tiger run");
  32.             }
  33.         }
  34.   }
  35. }

(3) Phương pháp implement đa hình thứ 3 là "late binding" hay dịch nôm la là liên kết muộn !
Binding là phương pháp conect đến một method , property thông qua object ,
Early Binding có nghĩa là program biết rõ ngay từ đầu loại Object (thuộc Class nào) sẽ được dùng trong hoàn cảnh nào. Nó cho phép IntelliSense hiển thị cho ta thấy những class members nào ta có thể dùng và compiler kiểm xem những methods ta dùng có hiện hữu không. Early Binding code được compiled ra IL rất hiệu năng vì compiler biết rõ ràng data types của các parameters. Ví dụ khi ta định nghĩa một object
  1.  Form f = new Form() ;
  2.  f.Show() ;
  3.  

Ở trường hợp này ta thấy do f được định nghĩa kiểu rõ ràng nên ta dễ dàng nhờ VS2008 show toàn bộ phương thức nhờ IntelliSense !
Early binding có ưu điểm là performance nhanh do object method name, type được relsolve lúc complie time ,nhưng độ mềm dẻo, linh động kém!
Ví dụ trong trường hợp ta cần thao tác với một service trả về nhiều kiểu dữ liệu không định trước thì ta sẽ ko dùng đươc hoặc phải xử lý phức tạp!Lúc này cần dùng tới latebinding

Late Binding có nghĩa là ta làm việc cách linh động với một Object lúc run-time, tức là program không biết trước Object ấy thuộc loại nào. Late Binding cho ta sự uyển chuyển chỉ làm sao Object cung cấp đúng method cần thiết là đủ. Do đó, ta không hưởng được sự sang trọng IntelliSense cung cấp và compiler không thể kiểm soát loại Object trước dùm cho ta được. Mặc dầu Late Binding code chạy chậm hơn nhưng nó cho ta sự tự do giống như khi làm việc ngoài đời, để đến giờ chót mới xác nhận.

Ở mức cao nhất , ta thậm chỉ không biết object type và method name, với các ngôn ngữ VB 6 latebining được dùng với hàm CreateObject và CallByName
với VB.NET,C# ta vấn có thể dungg Microsoft.VisualBasic.Interaction.CallByName + Activator.CreateInstance hoặc dùng reflection
Ở mức thấp hơn ,ta có thể dùng interface để implement latebining, lúc này chỉ khi đến lúc runtime ta mới biết interface được implement cụ thể như thế nào!
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

devper94
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 58
Ngày tham gia: T.Bảy 17/05/2008 4:23 pm
Đến từ: +∞
Has thanked: 1 time
Been thanked: 1 time

Re: Đa hình là gì ? có bao nhiêu cách implement đa hình ?

Gửi bàigửi bởi devper94 » T.Sáu 15/06/2012 4:29 pm

Em thấy .net 4.0 có thêm duck typing, cho phép dùng đa hình mà không cần đến interface, khá hay.


Quay về “Lập trình hướng đối tượng (OOP)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách