Lập trình OOP với C#

Lập trình OOP với C#. Lập trình hướng đối tượng với C#

Đa hình trong Lập trình hướng đối tượng Đa hình trong Lập trình hướng đối tượng Đa hình trong Lập trình hướng đối tượng Đa hình trong Lập trình hướng đối tượng Đa hình trong Lập trình hướng đối tượng 5/5 (54 reviews)

Đa hình trong Lập trình hướng đối tượng

Đã đăng 2017-03-07 11:17:09 bởi Kteam
5 bình luận 21853 lượt xem
Đa hình trong Lập trình hướng đối tượng 5 /5 stars (5 reviews)
 

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về KẾ THỪA TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG . Hôm nay chúng ta sẽ cùng tìm hiểu về Đa hình trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Khái niệm tính đa hình.
  • Từ khoá virtual và từ khoá override.
  • Lớp trừu tượng và phương thức thuần ảo.

Khái niệm tính đa hình

Tính đa hình là hiện tượng các đối tượng thuộc các lớp khác nhau có thể hiểu cùng 1 thông điệp theo các cách khác nhau.

Một ví dụ về đa hình trong thực tế. Ta có 3 con vật: chó, mèo, lợn. Cả 3 con vật này đều là động vật. Nhưng khi ta bảo cả 3 động vật kêu thì con chó sẽ kêu gâu gâu, con mèo sẽ kêu meo meo và con heo sẽ kêu ẹt ẹt.

Trong ví dụ trên 3 con vật: chó, mèo, lợn xem như là các đối tượng. Việc ta bảo 3 động vật kêu chính là thông điệp. Rõ ràng cả 3 con vật có thể hiểu cùng 1 thông điệp là kêu theo các cách khác nhau.

Để thể hiện được tính đa hình:

  • Các lớp phải có quan hệ kế thừa với cùng 1 lớp cha nào đó.
  • Phương thức đa hình phải được ghi đè (override) ở các lớp con (sẽ được trình bày ngay sau đây).

Từ khoá virtual và từ khoá override

Virtual là từ khoá dùng để khai báo 1 phương thức ảo (phương thức ảo là phương thức có thể ghi đè được).

Override là từ khoá dùng để đánh dấu phương thức ghi đè lên phương thức của lớp cha.

Lưu ý:

  • Chỉ có thể ghi đè lên phương thức virtual hoặc abstract (sẽ trình bày ngay sau đây).
  • Tính đa hình chỉ được thể hiện khi đã ghi đè lên phương thức của lớp cha.

Ví dụ minh hoạ:

Ta có 3 lớp Animal, Cat, Dog. Trong đó Cat Dog kề thừa từ lớp Animal. Trong các lớp đều có phương thức Speak().

class Animal
    {

        public void Speak()
        {
            Console.WriteLine(" Animal is speaking. . .");
        }
    }


    class Cat : Animal
    {
        public void Speak()
        {
            Console.WriteLine(" Cat is speaking. . .");
        }
    }


    class Dog : Animal
    {
        public void Speak()
        {
            Console.WriteLine(" Dog is speaking. . .");
        }
    }

Ta có đoạn chương trình trong hàm main như thế này:

Animal cat = new Cat();

            Animal dog = new Dog();
            cat.Speak();
            dog.Speak();

Ta mong muốn chương trình sẽ gọi đúng phương thức Speak() của lớp đã được cấp phát vùng nhớ. Nhưng thực tế không phải vậy.

kteam, howkteam, csharp, c#oop,

Lúc này ta cần phải override phương thức Speak() của lớp cha (lớp Animal) và để override được thì ta cần khai báo phương thức Speak() của lớp cha là phương thức ảo (virtual).

class Animal
    {
        public virtual void Speak()
        {
            Console.WriteLine(" Animal is speaking. . .");
        }
    }



    class Cat : Animal
    {
        public override void Speak()
        {
            Console.WriteLine(" Cat is speaking. . .");
        }
    }


    class Dog : Animal
    {
        public override void Speak()
        {
            Console.WriteLine(" Dog is speaking. . .");
        }
    }

Chạy lại hàm main trên ta được:

kteam, howkteam, CSharp, OOP, C#

Đây cũng chính là ví dụ sử dụng tính đa hình.

Ta thấy 2 đối tượng dog, cat được cấp phát 2 vùng nhớ thuộc 2 lớp 2 khác nhau nhưng khi cùng gọi phương thức Speak() thì đối tượng tham chiếu đến vùng nhớ của lớp nào sẽ được gọi đúng phương thức của lớp đó.


Lớp trừu tượng và phương thức thuần ảo

Phương thức thuần ảo là 1  phương thức ảo và không có định nghĩa bên trong.

Lớp trừu tượng là lớp chứa phương thức thuần ảo.

Abstract là từ khoá dùng để khai báo 1 lớp trừu tượng hoặc 1 phương thức thuần ảo.

Xét lại ví dụ trên, Ở đây ta xem lại phương thức Speak() của lớp Animal ta nhận thấy phần định nghĩa của phương thức này chỉ là hình thức sau đó cũng sẽ bị các lớp kế thừa ghi đè lên.

Việc định nghĩa nội dung phương thức không có tác dụng gì vậy tại sao ta lại phải định nghĩa chúng?

Câu trả lời đã được C# giải đáp qua từ khoá abstract. Ở đây ta sử dụng abstract để nhấn mạnh 2 điều:

  • Phương thức Speak() có thể ghi đè (override).
  • Phương thức Speak() không có định nghĩa gì bên trong.

Để khai báo lớp trừu tượng và phương thức thuần ảo ta chỉ cần thêm khoá abstract vào trước tên lớp và tên phương thức.

abstract class Animal
    {
        /*
            Khai báo phương thức thuần ảo nên không cần định nghĩa nội dung cho phương thức
         */

        public abstract void Speak();

    }

Khi chạy chương trình mọi thứ vẫn ra đúng như mong muốn.

Lưu ý:

  • Khi kế thừa 1 lớp trừu tượng bạn bắt buộc phải override tất cả các phương thức thuần ảo nhằm đảm bảo tính hợp lệ cho chương trình.

Kết luận

Nội dung bài này giúp các bạn nắm được:

  • Khái niệm tính đa hình.
  • Từ khoá virtual và từ khoá override.
  • Lớp trừu tượng và phương thức thuần ảo.

Bài sau chúng ta sẽ tìm hiểu về INTERFACE TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tài liệu 

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Đa hình trong Lập trình hướng đối tượng dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé! 


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
Đa hình trong Lập trình hướng đối tượng
palladium88 2018-09-28 16:44:05
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp8
{
   abstract class Animal
    {
        public abstract void Speak();
    }
    class Cat: Animal
    {
        public override void Speak()
        {
            Console.WriteLine("Cat is speaking...");
            Console.WriteLine("Meo Meo...");
        }
    }
    class Dog:Animal
    {
        public override void Speak()
        {
            Console.WriteLine("Dog is speaking...");
            Console.WriteLine("Gau Gau...");
        }
    }
    class Speaking
    { 
        static void Main(string[] args)
        {
            Animal cat = new Cat();
            Animal dog = new Dog();
      
            cat.Speak();
            dog.Speak();
         
            Console.ReadKey();
        }
    }
}

 

0 bình chọn
Reply
Đa hình trong Lập trình hướng đối tượng
laRoi17 2018-08-14 23:51:53

cảm ơn ad

0 bình chọn
Reply
Đa hình trong Lập trình hướng đối tượng
dungnnn8979 2018-06-18 20:48:03

sau một số bài học mong ad ra thêm bài tập để mọi người làm quen dễ hơn và nhớ kiến thức hơn

0 bình chọn
Reply
Đa hình trong Lập trình hướng đối tượng
noirefield 2017-09-20 16:18:36

Mình không hiểu cái chỗ này, 2 cái này khác nhau ở điểm nào và tại sao phải dùng một trong hai?

Animal A = new Cat();

Cat A = new Cat();

 

1 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
hieu718353 2018-01-19 22:41:15
bạn coi kĩ lại video , 1 cái là tổng thể, 1 cái là cái con. vd : 1 cái là xe , 1 cái là xe đạp Khác nhau là khi bạn Animal A = new Cat() mà k override thì nó sẽ gọi lớp cha là "Animal speaking" ngược là nếu Animal A = new Cat() đã override thì sẽ gọi lớp con , là "Cat is speaking" khi đó thì sẽ sử dụng 1 trong 2 cách để gọi lớp con, chứ k dùng cả 2 vì Cat A = new Cat() là gọi hàm của nó là "Cat is speaking" . nó giống nhau
0 bình chọn
Reply
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education