Abstract Class
Nhìn lại chủ đề kế thừa của chúng tôi, chúng tôi lưu ý rằng lớp Employee đang được sử dụng làm lớp cơ sở cho Manager và Programmer. Chúng tôi có thể tiếp tục mở rộng lớp Employee bằng cách tạo ra nhiều lớp con theo yêu cầu cho các nhân viên khác nhau trong ứng dụng của chúng tôi. Tuy nhiên, khi nhìn vào hệ thống phân cấp lớp của chúng tôi, nó có ý nghĩa để có thể tạo ra một đối tượng kiểu Employee, trực tiếp không? Chắc chắn lớp cơ sở chứa các thuộc tính chung nhưng thực tế chúng ta chỉ muốn tạo các đối tượng của các loại nhân viên cụ thể.
Để thực thi hành vi này trong mã của chúng tôi, chúng tôi nên xem xét việc biến lớp Employee thành một lớp trừu tượng. Các lớp trừu tượng có liên quan chặt chẽ với các interface, sẽ được đề cập trong chủ đề tiếp theo. Các lớp trừu tượng không thể được khởi tạo, điều đó có nghĩa là chúng ta sẽ không thể tạo một đối tượng Employee mới trong mã với câu lệnh này:
Employee newEmployee = new Employee();
Khi bạn tạo một lớp trừu tượng, bạn có thể thực hiện một phần một số hành vi trong lớp hoặc hoàn toàn không thực hiện hành vi đó. Một lớp trừu tượng yêu cầu lớp con thực hiện một số hoặc tất cả các chức năng. Nếu chúng ta mở rộng ví dụ trước về các lớp Employee và Manager, sử dụng các lớp trừu tượng, chúng ta có thể chứng minh khái niệm này tốt hơn. Lưu ý rằng lớp nhân viên hiện bao gồm một số phương thức để thực hiện các hành vi.
abstract class Employee
{
private string empNumber;
private string firstName;
private string lastName;
private string address;
.....
public virtual void Login()
{
}
public virtual void LogOff()
{
}
public abstract void EatLunch();
}
Trong mẫu code này, ..... được sử dụng để biểu thị rằng một số mã đã được cắt từ mẫu này để rút ngắn nó để hiển thị. Hãy xem xét các thuộc tính vẫn còn trong mã.
Cũng lưu ý rằng chúng tôi hiện đã thêm từ khóa abstract cho lớp của chúng tôi: abstract class Employee. Làm như vậy sẽ chuyển đổi lớp của chúng ta thành một lớp trừu tượng và thiết lập một số yêu cầu. Khi bạn tạo một lớp trừu tượng, bạn quyết định phương thức "phải" nào được thực hiện trong các lớp con và phương thức nào "có thể" được thực hiện hoặc ghi đè, trong lớp con. Có một sự khác biệt rõ ràng.
Bất kỳ phương thức nào bạn khai báo trong lớp trừu tượng sẽ chứa một số triển khai trong lớp trừu tượng, nhưng có thể được ghi đè trong lớp con, bạn trang trí bằng từ khóa virtual. Lưu ý trong mẫu code trước đó, Login() và LogOff() đều được trang trí bằng từ khóa virtual. Điều này có nghĩa là bạn có thể viết mã triển khai trong lớp trừu tượng và các lớp con được tự do ghi đè lên việc thực hiện hoặc chấp nhận thực hiện được kế thừa.
Phương thức EatLunch() được trang trí với từ khóa trừu tượng, giống như lớp. Có các ràng buộc cụ thể xung quanh một phương thức trừu tượng:
- Một phương thức trừu tượng không thể tồn tại trong lớp không trừu tượng
- Một phương thức trừu tượng không được phép thực hiện, bao gồm cả dấu ngoặc nhọn
- Một chữ ký phương thức trừu tượng phải kết thúc bằng dấu chấm phẩy
- Một phương thức trừu tượng PHẢI được thực hiện trong bất kỳ lớp con nào. Không làm như vậy sẽ tạo ra một cảnh báo trình biên dịch trong C#.
Sealed Classes
Chúng tôi đã đề cập đến sự kế thừa cho các thừa kế của lớp và đã chỉ ra làm thế nào các lớp cơ sở có thể được kế thừa bởi các lớp con và chúng tôi có các lớp trừu tượng khác nhau. Cả hai khái niệm tập trung vào khả năng của một lớp được kế thừa và cung cấp các thuộc tính và hành vi cho các lớp khác, cho mục đích tái sử dụng mã. Nhưng điều gì xảy ra nếu bạn quyết định rằng bạn không muốn lớp của mình được kế thừa? Làm thế nào để bạn ngăn chặn điều đó xảy ra? Rất đơn giản, bạn có thể tạo một sealed class. Bạn có thể sử dụng từ khóa kín trên lớp của mình để hạn chế tính năng kế thừa của lập trình hướng đối tượng. Nếu một lớp có nguồn gốc từ một sealed class thì trình biên dịch sẽ đưa ra một lỗi.
Mặc dù chúng tôi không đề cập đến vấn đề này trong các chủ đề về cấu trúc, nhưng điều quan trọng cần lưu ý là trong khi các cấu trúc giống như các lớp ở một số khía cạnh, các cấu trúc được niêm phong. Vì vậy, bạn không thể lấy được một lớp từ một cấu trúc.
إرسال تعليق