Tóm Tắt
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
và 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 virtual
và override
cần được sử dụng. Class Horse
và 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
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
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ì
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.