Kế thừa và từ khóa virtual trong c#

16:00 ngày 10-11-2017

Trong lập trình hướng đối tượng, việc kế thừa các class với nhau trở thành điều hiển hiên. Và vấn đề phát sinh là làm sao gọi được phương thức con từ lớp cha. Từ khóa virtual giúp giải quyết vấn đề này

Từ khóa virtual được sử dụng để chỉnh sửa một phương thước, thuộc tính,.. Nó cho phép lớp con override lại từ lớp cha. Khi một phương thức virtual được thực thi, kiểu của đối tượng tại thời điểm thực thi (run-time type) được kiểm tra và phương thức được override từ lớp con sẽ được gọi

Mặc định các phương thức là non-virtual. Từ khóa virtual không thể được sử dụng với các từ khóa static, abstract, private override

Ví dụ bên dưới sẽ mô tả cách thức hoạt động của từ khóa virtual

using System;

namespace KeThua
{
    class Program
    {
        class  Horse
        {
            public string SayHello()
            {
                return "Hello, I'm an horse";
            }
        }
        class Donkey : Horse
        {
            public string SayHello()
            {
                return "Hello, I'm a donkey";
            }
        }

        static void PrintHello(Horse obj)
        {
            Console.WriteLine(obj.SayHello());
        }

        static void Main(string[] args)
        {
            var horse = new Horse();
            var donkey = new Donkey();
            PrintHello(horse);
            PrintHello(donkey);
            Console.ReadKey();
        }
    }
}

Kết quả thực thi chương trình

Hello, I'm an horse
Hello, I'm an horse

Chúng ta mong đợi PrintHello(donkey); sẽ in ra  Hello, I'm a donkey. Nhưng thực tế lại khác. Khi gọi hàm PrintHello(), donkey được ép qua kiểu Horse. Chính vì vậy, khi chương trình thực thi, nó sẽ gọi hàm SayHello() của class Horse
Để chương trình biết phải gọi hàm SayHello() của class Donkey tại thời điểm thực thi. Thì từ khóa virtualoverride cần được sử dụng. Class Horse Donkey cần được sửa như bên dưới.

class  Horse
{
    public virtual string SayHello()
    {
        return "Hello, I'm an horse";
    }
}
class Donkey : Horse
{
    public override string SayHello()
    {
        return "Hello, I'm a donkey";
    }
}

Bây giờ kết quả đã như mong đợi

Hello, I'm an horse
Hello, I'm a donkey

 

Sự khác nhau giữa Abstract và Virtual
Cả hai từ khóa này điều giúp phương thức của lớp con được triệu gọi ở run-time. Nhưng khác với Virtual, từ khóa Abstract sẽ làm cả đối tượng trở thành Abstract và không thể hiện thực đối tượng (Không thể khởi tạo đối tượng từ lớp Abstract). Đồng thơi phương thức với từ khóa Abstract bắt buộc không được Implement ở lớp cha. Và lớp con phải implement nó. Chúng ta có thể sơ lược như sau
- Phương thức Abstract phải nằm trong lớp Abstract
- Phương thức Abstract không được có phần thân hàm
- Lớp con phải viết lại tất cả các phương thước Abstract khi kế thừa lớp Abstract
- Lớp Abstract thì không thể khởi tạo

Bên dưới là cách sử dụng abstract

abstract class Horse
{
    abstract public string SayHello();
}
class Donkey : Horse
{
    public override string SayHello()
    {
        return "Hello, I'm a donkey";
    }
}

 

 

Phản Hồi

04:56:32 Nov 10, 2017

dd

ssd

Viết Phản Hồi

Chuyên Mục

Phản Hồi Mới