Trang chủ
Bài viết mới
Diễn đàn
Bài mới trên hồ sơ
Hoạt động mới nhất
VIDEO
Mùa Tết
Văn Học Trẻ
Văn Học News
Media
New media
New comments
Search media
Đại Học
Đại cương
Chuyên ngành
Triết học
Kinh tế
KHXH & NV
Công nghệ thông tin
Khoa học kĩ thuật
Luận văn, tiểu luận
Phổ Thông
Lớp 12
Ngữ văn 12
Lớp 11
Ngữ văn 11
Lớp 10
Ngữ văn 10
LỚP 9
Ngữ văn 9
Lớp 8
Ngữ văn 8
Lớp 7
Ngữ văn 7
Lớp 6
Ngữ văn 6
Tiểu học
Thành viên
Thành viên trực tuyến
Bài mới trên hồ sơ
Tìm trong hồ sơ cá nhân
Credits
Transactions
Xu: 0
Đăng nhập
Đăng ký
Có gì mới?
Tìm kiếm
Tìm kiếm
Chỉ tìm trong tiêu đề
Bởi:
Hoạt động mới nhất
Đăng ký
Menu
Đăng nhập
Đăng ký
Install the app
Cài đặt
Chào mừng Bạn tham gia Diễn Đàn VNKienThuc.com -
Định hướng Forum
Kiến Thức
- HÃY TẠO CHỦ ĐỀ KIẾN THỨC HỮU ÍCH VÀ CÙNG NHAU THẢO LUẬN Kết nối:
VNK X
-
VNK groups
| Nhà Tài Trợ:
BhnongFood X
-
Bhnong groups
-
Đặt mua Bánh Bhnong
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
Tính đa hình trong C# là gì?
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Trả lời chủ đề
Nội dung
<blockquote data-quote="uocmo_kchodoi" data-source="post: 177535" data-attributes="member: 165510"><p style="text-align: center"><strong><span style="color: #ff0000">TÍNH ĐA HÌNH (POLYMORPHISM) TRONG C#</span></strong></p> <p style="text-align: center"><strong><span style="color: #ff0000"></span></strong></p><p><strong>Khái niệm: </strong>Đa hình có nhiều hình thức về nghĩa. Trong mô hình lập trình hướng đối tượng, đa hình thường được hiểu là “một giao diện, nhiều chức năng”.</p><p></p><p>Đa hình có thể là tĩnh hoặc động. Trong đa hình tĩnh, sự đáp lại với một chức năng được xác định tại thời gian biên dịch. Trong đa hình năng động, nó được quyết định tại thời gian chạy.</p><p></p><p>Tính đa hình trong C# có thể là static hoặc dynamic. Trong đó, kiểu đa hình static có thể được gọi là đa hình tĩnh và kiểu đa hình dynamic có thể được gọi là đa hình động.</p><p></p><p>Trong đa hình tĩnh, phần phản hồi tới một hàm được xác định tại compile time. Trong khi đó với đa hình động, nó được quyết định tại runtime.</p><p></p><p><span style="font-size: 18px"><span style="color: #0000ff"><strong>1. Đa hình static trong C#</strong></span></span></p><p><span style="font-size: 18px"><span style="color: #0000ff"></span></span></p><p>Kỹ thuật liên kết một hàm với một đối tượng trong thời gian biên dịch được gọi là Early Binding. Nó cũng được gọi là Static Binding. C# cung cấp hai kỹ thuật để triển khai đa hình tĩnh. Chúng là:</p><ul> <li data-xf-list-type="ul">Nạp chồng hàm (Function overloading)</li> <li data-xf-list-type="ul">Nạp chồng toán tử (Operator overloading)</li> </ul><p>Chúng ta sẽ bàn luận về nạp chồng toán tử trong chương sau.</p><p></p><p><span style="font-size: 18px"><span style="color: #0000ff"><strong>2. Nạp chồng hàm trong C#</strong></span></span></p><p><span style="font-size: 18px"><span style="color: #0000ff"></span></span></p><p>Bạn có thể có nhiều định nghĩa cho cùng tên hàm trong cùng một phạm vi. Các định nghĩa này của hàm phải khác nhau: như kiểu và/hoặc số tham số trong danh sách tham số. Trong C#, bạn không thể nạp chồng các khai báo hàm mà chỉ khác nhau ở kiểu trả về.</p><p></p><p>Ví dụ sau minh họa cách sử dụng hàm print() để in các kiểu dữ liệu khác nhau trong C#:</p><p></p><p><em><span style="color: #5900b3">using System;</span></em></p><p><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></p><p><em><span style="color: #5900b3">{</span></em></p><p><em><span style="color: #5900b3"> public class TestCsharp</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> void print(int i)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("In so nguyen: {0}", i);</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> void print(double f)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("In so thuc: {0}", f);</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> void print(string s)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("In chuoi: {0}", s);</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"></span></em></p><p><em><span style="color: #5900b3"> static void Main(string[] args)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("Tinh da hinh trong C#");</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("--------------------------");</span></em></p><p><em><span style="color: #5900b3"> //tao doi tuong TestCsharp</span></em></p><p><em><span style="color: #5900b3"> TestCsharp p = new TestCsharp();</span></em></p><p><em><span style="color: #5900b3"></span></em></p><p><em><span style="color: #5900b3"> // goi ham print()</span></em></p><p><em><span style="color: #5900b3"> p.print(5);</span></em></p><p><em><span style="color: #5900b3"> p.print(500.263);</span></em></p><p><em><span style="color: #5900b3"> p.print("Hoc C# co ban va nang cao");</span></em></p><p><em><span style="color: #5900b3"> Console.ReadKey();</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3">}</span></em></p><p>Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.</p><p></p><p>Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:</p><p></p><p style="text-align: center"><img src="https://vietjack.com/csharp/images/tinh-da-hinh.PNG" alt="" class="fr-fic fr-dii fr-draggable " data-size="" style="" /></p> <p style="text-align: center"></p><p><span style="font-size: 18px"><span style="color: #0000ff"><strong>3. Đa hình dynamic trong C#</strong></span></span></p><p><span style="font-size: 18px"><span style="color: #0000ff"></span></span></p><p>C# cho phép bạn tạo các lớp abstract (trừu tượng) mà được sử dụng để cung cấp trình triển khai cục bộ lớp của một Interface. Trình triển khai (Implementation) được hoàn thành khi một lớp kế thừa kế thừa từ nó. Các lớp Abstract chứa các phương thức abstract, mà được triển khai bởi lớp kế thừa. Lớp kế thừa này có tính năng chuyên dụng hơn.</p><p></p><p>Dưới đây là một số qui tắc về các lớp abstract trong C#:</p><ul> <li data-xf-list-type="ul">Bạn không thể tạo một Instance (sự thể hiện) của một lớp abstract.<br /> <br /> </li> <li data-xf-list-type="ul">Bạn không thể khai báo một phương thức abstract ở bên ngoài một lớp abstract.<br /> <br /> </li> <li data-xf-list-type="ul">Khi một lớp được khai báo là sealed, nó không thể được kế thừa, các lớp abstract không thể được khai báo là sealed.<br /> </li> </ul><p>Ví dụ sau minh họa một lớp abstract trong C#: tạo 3 lớp có tên lần lượt là Shape, HinhChuNhat, TestCsharp như sau:</p><p></p><p>Lớp Shape: là một lớp abstract</p><p></p><p><em><span style="color: #5900b3">using System;</span></em></p><p><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></p><p><em><span style="color: #5900b3">{</span></em></p><p><em><span style="color: #5900b3"> abstract class Shape</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> public abstract int tinhDienTich();</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3">}</span></em></p><p></p><p>Lớp HinhChuNhat: là một lớp kế thừa lớp Shape</p><p></p><p><em><span style="color: #5900b3">using System;</span></em></p><p><em><span style="color: #5900b3"></span></em></p><p><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></p><p><em><span style="color: #5900b3">{</span></em></p><p><em><span style="color: #5900b3"> class HinhChuNhat : Shape</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> private int chieu_dai;</span></em></p><p><em><span style="color: #5900b3"> private int chieu_rong;</span></em></p><p><em><span style="color: #5900b3"> public HinhChuNhat(int a = 0, int b = 0)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> chieu_dai = a;</span></em></p><p><em><span style="color: #5900b3"> chieu_rong = b;</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> public override int tinhDienTich()</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("Dien tich hinh chu nhat:");</span></em></p><p><em><span style="color: #5900b3"> return (chieu_rong * chieu_dai);</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3">}</span></em></p><p>Lớp TestCsharp: chứa phương thức main() để thao tác trên đối tượng HinhChuNhat</p><p></p><p><span style="color: #5900b3"><em>using System;</em></span></p><p><span style="color: #5900b3"><em>namespace VietJackCsharp</em></span></p><p><span style="color: #5900b3"><em>{</em></span></p><p><span style="color: #5900b3"><em> public class TestCsharp</em></span></p><p><span style="color: #5900b3"><em> {</em></span></p><p><span style="color: #5900b3"><em> static void Main(string[] args)</em></span></p><p><span style="color: #5900b3"><em> {</em></span></p><p><span style="color: #5900b3"><em> Console.WriteLine("Tinh da hinh trong C#");</em></span></p><p><span style="color: #5900b3"><em> Console.WriteLine("Vi du minh hoa Da hinh dong");</em></span></p><p><span style="color: #5900b3"><em> Console.WriteLine("--------------------------");</em></span></p><p><span style="color: #5900b3"></span></p><p><span style="color: #5900b3"><em> HinhChuNhat r = new HinhChuNhat(10, 7);</em></span></p><p><span style="color: #5900b3"><em> double a = r.tinhDienTich();</em></span></p><p><span style="color: #5900b3"><em> Console.WriteLine("Dien tich: {0}", a);</em></span></p><p><span style="color: #5900b3"><em> Console.ReadKey();</em></span></p><p><span style="color: #5900b3"><em> }</em></span></p><p><span style="color: #5900b3"><em> }</em></span></p><p><span style="color: #5900b3"><em>}</em></span></p><p>Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:</p><p></p><p style="text-align: center"><img src="https://vietjack.com/csharp/images/tinh-da-hinh-1.PNG" alt="" class="fr-fic fr-dii fr-draggable " data-size="" style="" /></p> <p style="text-align: center"></p><p>Khi bạn có một hàm được định nghĩa trong một lớp mà bạn muốn được triển khai một lớp được kế thừa, bạn sử dụng hàm virtual trong C#. Các hàm virtual có thể được triển khai một cách khác nhau trong lớp được kế thừa khác nhau và việc gọi những hàm này sẽ được quyết định tại runtime.</p><p></p><p>Đa hình động trong C# được triển khai bởi các lớp abstract và các hàm virtual.</p><p></p><p>Ví dụ sau minh họa điều này: tạo 5 lớp có tên lần lượt là như sau:</p><p></p><p>Lớp Shape: lớp cơ sở</p><p></p><p><em><span style="color: #5900b3">using System;</span></em></p><p><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></p><p><em><span style="color: #5900b3">{</span></em></p><p><em><span style="color: #5900b3"> class Shape</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> protected int chieu_rong, chieu_cao;</span></em></p><p><em><span style="color: #5900b3"> public Shape(int a = 0, int b = 0)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> chieu_rong = a;</span></em></p><p><em><span style="color: #5900b3"> chieu_cao = b;</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> public virtual int tinhDienTich()</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("Dien tich cua class cha: ");</span></em></p><p><em><span style="color: #5900b3"> return 0;</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3">}</span></em></p><p></p><p>Lớp HinhChuNhat: là lớp kế thừa lớp Shape</p><p></p><p><em><span style="color: #5900b3">using System;</span></em></p><p><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></p><p><em><span style="color: #5900b3">{</span></em></p><p><em><span style="color: #5900b3"> class HinhChuNhat : Shape</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> public HinhChuNhat( int a=0, int b=0): base(a, b)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"></span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> public override int tinhDienTich()</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("Dien tich cua class HinhChuNhat: ");</span></em></p><p><em><span style="color: #5900b3"> return (chieu_rong * chieu_cao); </span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3">}</span></em></p><p></p><p>Lớp TamGiac: là lớp kế thừa lớp Shape</p><p></p><p><em><span style="color: #5900b3">using System;</span></em></p><p><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></p><p><em><span style="color: #5900b3">{</span></em></p><p><em><span style="color: #5900b3"> class TamGiac : Shape</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> public TamGiac(int a = 0, int b = 0) : base(a, b)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> </span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> public override int tinhDienTich()</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("Dien tich cua class TamGiac: ");</span></em></p><p><em><span style="color: #5900b3"> return (chieu_cao * chieu_rong / 2); </span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3">}</span></em></p><p></p><p>Lớp HienThiDuLieu: in các dữ liệu</p><p></p><p><span style="color: #5900b3"><em>using System;</em></span></p><p><span style="color: #5900b3"><em>namespace VietJackCsharp</em></span></p><p><span style="color: #5900b3"><em>{</em></span></p><p><span style="color: #5900b3"><em> class HienThiDuLieu</em></span></p><p><span style="color: #5900b3"><em> {</em></span></p><p><span style="color: #5900b3"><em> public void hienThiDienTich(Shape sh)</em></span></p><p><span style="color: #5900b3"><em> {</em></span></p><p><span style="color: #5900b3"><em> int a;</em></span></p><p><span style="color: #5900b3"><em> a = sh.tinhDienTich();</em></span></p><p><span style="color: #5900b3"><em> Console.WriteLine("Dien tich: {0}", a);</em></span></p><p><span style="color: #5900b3"><em> }</em></span></p><p><span style="color: #5900b3"><em> }</em></span></p><p><span style="color: #5900b3"><em>}</em></span></p><p>Lớp TestCsharp: chứa phương thức main() để thao tác trên các đối tượng</p><p></p><p><em><span style="color: #5900b3">using System;</span></em></p><p><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></p><p><em><span style="color: #5900b3">{</span></em></p><p><em><span style="color: #5900b3"> public class TestCsharp</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> static void Main(string[] args)</span></em></p><p><em><span style="color: #5900b3"> {</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("Tinh da hinh trong C#");</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("Vi du minh hoa Da hinh dong");</span></em></p><p><em><span style="color: #5900b3"> Console.WriteLine("--------------------------");</span></em></p><p><em><span style="color: #5900b3"></span></em></p><p><em><span style="color: #5900b3"> HienThiDuLieu c = new HienThiDuLieu();</span></em></p><p><em><span style="color: #5900b3"> HinhChuNhat r = new HinhChuNhat(10, 7);</span></em></p><p><em><span style="color: #5900b3"> TamGiac t = new TamGiac(10, 5);</span></em></p><p><em><span style="color: #5900b3"> c.hienThiDienTich(r);</span></em></p><p><em><span style="color: #5900b3"> c.hienThiDienTich(t);</span></em></p><p><em><span style="color: #5900b3"></span></em></p><p><em><span style="color: #5900b3"> Console.ReadKey();</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3"> }</span></em></p><p><em><span style="color: #5900b3">}</span></em></p><p></p><p>Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:</p><p></p><p style="text-align: center"><img src="https://vietjack.com/csharp/images/tinh-da-hinh-2.PNG" alt="" class="fr-fic fr-dii fr-draggable " data-size="" style="" /></p> <p style="text-align: center"></p> <p style="text-align: right">Nguồn: vietjack.com</p></blockquote><p></p>
[QUOTE="uocmo_kchodoi, post: 177535, member: 165510"] [CENTER][B][COLOR=#ff0000]TÍNH ĐA HÌNH (POLYMORPHISM) TRONG C# [/COLOR][/B][/CENTER] [B]Khái niệm: [/B]Đa hình có nhiều hình thức về nghĩa. Trong mô hình lập trình hướng đối tượng, đa hình thường được hiểu là “một giao diện, nhiều chức năng”. Đa hình có thể là tĩnh hoặc động. Trong đa hình tĩnh, sự đáp lại với một chức năng được xác định tại thời gian biên dịch. Trong đa hình năng động, nó được quyết định tại thời gian chạy. Tính đa hình trong C# có thể là static hoặc dynamic. Trong đó, kiểu đa hình static có thể được gọi là đa hình tĩnh và kiểu đa hình dynamic có thể được gọi là đa hình động. Trong đa hình tĩnh, phần phản hồi tới một hàm được xác định tại compile time. Trong khi đó với đa hình động, nó được quyết định tại runtime. [SIZE=5][COLOR=#0000ff][B]1. Đa hình static trong C#[/B] [B][/B][/COLOR][/SIZE] Kỹ thuật liên kết một hàm với một đối tượng trong thời gian biên dịch được gọi là Early Binding. Nó cũng được gọi là Static Binding. C# cung cấp hai kỹ thuật để triển khai đa hình tĩnh. Chúng là: [LIST] [*]Nạp chồng hàm (Function overloading) [*]Nạp chồng toán tử (Operator overloading) [/LIST] Chúng ta sẽ bàn luận về nạp chồng toán tử trong chương sau. [SIZE=5][COLOR=#0000ff][B]2. Nạp chồng hàm trong C#[/B] [B][/B][/COLOR][/SIZE] Bạn có thể có nhiều định nghĩa cho cùng tên hàm trong cùng một phạm vi. Các định nghĩa này của hàm phải khác nhau: như kiểu và/hoặc số tham số trong danh sách tham số. Trong C#, bạn không thể nạp chồng các khai báo hàm mà chỉ khác nhau ở kiểu trả về. Ví dụ sau minh họa cách sử dụng hàm print() để in các kiểu dữ liệu khác nhau trong C#: [I][COLOR=#5900b3]using System; namespace VietJackCsharp { public class TestCsharp { void print(int i) { Console.WriteLine("In so nguyen: {0}", i); } void print(double f) { Console.WriteLine("In so thuc: {0}", f); } void print(string s) { Console.WriteLine("In chuoi: {0}", s); } static void Main(string[] args) { Console.WriteLine("Tinh da hinh trong C#"); Console.WriteLine("--------------------------"); //tao doi tuong TestCsharp TestCsharp p = new TestCsharp(); // goi ham print() p.print(5); p.print(500.263); p.print("Hoc C# co ban va nang cao"); Console.ReadKey(); } } }[/COLOR][/I] Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn. Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau: [CENTER][IMG]https://vietjack.com/csharp/images/tinh-da-hinh.PNG[/IMG] [/CENTER] [SIZE=5][COLOR=#0000ff][B]3. Đa hình dynamic trong C#[/B] [B][/B][/COLOR][/SIZE] C# cho phép bạn tạo các lớp abstract (trừu tượng) mà được sử dụng để cung cấp trình triển khai cục bộ lớp của một Interface. Trình triển khai (Implementation) được hoàn thành khi một lớp kế thừa kế thừa từ nó. Các lớp Abstract chứa các phương thức abstract, mà được triển khai bởi lớp kế thừa. Lớp kế thừa này có tính năng chuyên dụng hơn. Dưới đây là một số qui tắc về các lớp abstract trong C#: [LIST] [*]Bạn không thể tạo một Instance (sự thể hiện) của một lớp abstract. [*]Bạn không thể khai báo một phương thức abstract ở bên ngoài một lớp abstract. [*]Khi một lớp được khai báo là sealed, nó không thể được kế thừa, các lớp abstract không thể được khai báo là sealed. [/LIST] Ví dụ sau minh họa một lớp abstract trong C#: tạo 3 lớp có tên lần lượt là Shape, HinhChuNhat, TestCsharp như sau: Lớp Shape: là một lớp abstract [I][COLOR=#5900b3]using System; namespace VietJackCsharp { abstract class Shape { public abstract int tinhDienTich(); } }[/COLOR][/I] Lớp HinhChuNhat: là một lớp kế thừa lớp Shape [I][COLOR=#5900b3]using System; namespace VietJackCsharp { class HinhChuNhat : Shape { private int chieu_dai; private int chieu_rong; public HinhChuNhat(int a = 0, int b = 0) { chieu_dai = a; chieu_rong = b; } public override int tinhDienTich() { Console.WriteLine("Dien tich hinh chu nhat:"); return (chieu_rong * chieu_dai); } } }[/COLOR][/I] Lớp TestCsharp: chứa phương thức main() để thao tác trên đối tượng HinhChuNhat [COLOR=#5900b3][I]using System;[/I] [I]namespace VietJackCsharp[/I] [I]{[/I] [I] public class TestCsharp[/I] [I] {[/I] [I] static void Main(string[] args)[/I] [I] {[/I] [I] Console.WriteLine("Tinh da hinh trong C#");[/I] [I] Console.WriteLine("Vi du minh hoa Da hinh dong");[/I] [I] Console.WriteLine("--------------------------");[/I] [I][/I] [I] HinhChuNhat r = new HinhChuNhat(10, 7);[/I] [I] double a = r.tinhDienTich();[/I] [I] Console.WriteLine("Dien tich: {0}", a);[/I] [I] Console.ReadKey();[/I] [I] }[/I] [I] }[/I] [I]}[/I][/COLOR] Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau: [CENTER][IMG]https://vietjack.com/csharp/images/tinh-da-hinh-1.PNG[/IMG] [/CENTER] Khi bạn có một hàm được định nghĩa trong một lớp mà bạn muốn được triển khai một lớp được kế thừa, bạn sử dụng hàm virtual trong C#. Các hàm virtual có thể được triển khai một cách khác nhau trong lớp được kế thừa khác nhau và việc gọi những hàm này sẽ được quyết định tại runtime. Đa hình động trong C# được triển khai bởi các lớp abstract và các hàm virtual. Ví dụ sau minh họa điều này: tạo 5 lớp có tên lần lượt là như sau: Lớp Shape: lớp cơ sở [I][COLOR=#5900b3]using System; namespace VietJackCsharp { class Shape { protected int chieu_rong, chieu_cao; public Shape(int a = 0, int b = 0) { chieu_rong = a; chieu_cao = b; } public virtual int tinhDienTich() { Console.WriteLine("Dien tich cua class cha: "); return 0; } } }[/COLOR][/I] Lớp HinhChuNhat: là lớp kế thừa lớp Shape [I][COLOR=#5900b3]using System; namespace VietJackCsharp { class HinhChuNhat : Shape { public HinhChuNhat( int a=0, int b=0): base(a, b) { } public override int tinhDienTich() { Console.WriteLine("Dien tich cua class HinhChuNhat: "); return (chieu_rong * chieu_cao); } } }[/COLOR][/I] Lớp TamGiac: là lớp kế thừa lớp Shape [I][COLOR=#5900b3]using System; namespace VietJackCsharp { class TamGiac : Shape { public TamGiac(int a = 0, int b = 0) : base(a, b) { } public override int tinhDienTich() { Console.WriteLine("Dien tich cua class TamGiac: "); return (chieu_cao * chieu_rong / 2); } } }[/COLOR][/I] Lớp HienThiDuLieu: in các dữ liệu [COLOR=#5900b3][I]using System;[/I] [I]namespace VietJackCsharp[/I] [I]{[/I] [I] class HienThiDuLieu[/I] [I] {[/I] [I] public void hienThiDienTich(Shape sh)[/I] [I] {[/I] [I] int a;[/I] [I] a = sh.tinhDienTich();[/I] [I] Console.WriteLine("Dien tich: {0}", a);[/I] [I] }[/I] [I] }[/I] [I]}[/I][/COLOR] Lớp TestCsharp: chứa phương thức main() để thao tác trên các đối tượng [I][COLOR=#5900b3]using System; namespace VietJackCsharp { public class TestCsharp { static void Main(string[] args) { Console.WriteLine("Tinh da hinh trong C#"); Console.WriteLine("Vi du minh hoa Da hinh dong"); Console.WriteLine("--------------------------"); HienThiDuLieu c = new HienThiDuLieu(); HinhChuNhat r = new HinhChuNhat(10, 7); TamGiac t = new TamGiac(10, 5); c.hienThiDienTich(r); c.hienThiDienTich(t); Console.ReadKey(); } } }[/COLOR][/I] Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau: [CENTER][IMG]https://vietjack.com/csharp/images/tinh-da-hinh-2.PNG[/IMG] [/CENTER] [RIGHT]Nguồn: vietjack.com[/RIGHT] [/QUOTE]
Tên
Mã xác nhận
Gửi trả lời
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
Tính đa hình trong C# là gì?
Top