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

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";
    }
}

 

 

Bài Viết Cùng Chuyên Mục

SqlCommandBuilder với Insert, Update và Delete dữ liệu từ DataGridview đến Database

SqlCommandBuilder với Insert, Update và Delete dữ liệu từ DataGridview đến Database

Nếu DataTable được map hay được select ra từ một bảng. Chúng ta có thể dùng SqlCommandBuilder để tự động tạo ra DeleteComment, InsertCommand và UpadteComment cho DataAdapter.
Yêu cầu ở đây chúng ta phải có câu lệnh SelectCommand cho DataAdapter. Và câu lệnh phải trả về ít nhất 1 khóa hoặc là unique column. Nếu không chúng ta sẽ nhận Exeption khi cố gắng delete hoặc update một column (Nó vẫn có thể hoạt động cho Insert)

Kết nối SQLite bằng Entity framework

Kết nối SQLite bằng Entity framework

SQLite là một SQL Database Engine. Nó có thể tổ chức và quản lý dữ liệu mà không cần server. Entity framework là một framework mạnh mẽ để kết nối databse. Bài viết sẽ hướng dẫn các kết nối SQlite thông qua EF, hướng dẫn fix một số lỗi thông dụng khi làm việc.

MachineKey là gì

MachineKey là gì

Theo giới thiệu của microsoft thì MachineKey là một cấu hình về những thuật toán và key được sử dụng để mã hóa, giải mã và xác nhận dữ liệu FormAuthentication.