Từ khóa sealed (niêm phong) trong C#
Trong bài viết này chúng ta sẽ cùng tìm hiểu về từ khóa sealed và ý nghĩa của nó trong lập trình C#.
- Từ khóa sealed là gì?
- Một số đặc điểm của từ khóa sealed
- Sử dụng từ khóa sealed khi nào?
- Cách sử dụng từ khóa sealed
- #1. Đối với class
- #2. Đối với method
1. Từ khóa sealed là gì?
sealed có nghĩa thuần Việt là niêm phong. Trong C#, cho phép bạn dùng từ khóa sealed để khai báo cho một lớp hoặc một phương thức. Đúng theo ý nghĩa của nó, khi bạn sử dụng từ khóa này cho lớp thì lớp đó không được kế thừa, còn khi sử dụng cho phương thức thì phương thức đó không được phép override.
2. Một số đặc điểm của từ khóa sealed
– sealed class có thể kế thừa một lớp khác, nhưng không một lớp nào được kế thừa từ nó. Do đó, khi một lớp đang được lớp khác kế thừa thì trong lớp đó không được sử dụng từ khóa sealed để khai báo cho phương thức lớp đó không được sử dụng từ khóa sealed để khai báo cho lớp.
– Trong sealed class các phương thức không được sử dụng phạm vi truy cập là protected, và cũng không có phương thức virtual, vì hai từ khóa này được dùng trong việc kế thừa.
– sealed class không thể là lớp trừu tượng abstract class, vì trong abstract class thì có phương thức abstract bắt buộc phải kế thừa ở lớp con.
– sealed class giống như final class trong java.
– Vì sealed method không được phép override, nên trong định nghĩa của sealed method nó luôn luôn đi kèm với từ khóa override.
– Trong sealed class không nhất thiết phải có sealed method.
3. Sử dụng từ khóa sealed khi nào?
Sử dụng khi bạn phát triển một thư viện library nào đấy, trong đó có một lớp đã đầy đủ những chức năng cần thiết cho một nghiệp vụ nhất định rồi và bạn không muốn lớp này được dẫn xuất, kế thừa, mở rộng bởi các lập trình viên khác nữa.
4. Cách sử dụng từ khóa sealed
#1. Đối với lớp
– Cú pháp:
[<quyen_truy_cap>] sealed class <Ten_lop> { ... }
Trong đó: quyen_truy_cap : là public hay private, protected,… Có thể có hoặc không.
– Minh họa:
{
public void SomeMethod() { ; }
public void SomeOtherMethod() { ; }
}
[/code]
#2. Đối với phương thức
– Cú pháp:
<quyen_truy_cap> sealed override <kieu_tra_ve> <Ten_phuong_thuc>([<danh_sach_tham_so>]) { ... }
Trong đó:
・ quyen_truy_cap : là public hay private, protected,…
・ danh_sach_tham_so : có thể có hoặc không.
– Minh họa:
{
public virtual void SomeMethod() { ; }
public virtual void SomeOtherMethod() { ; }
}
public class B : A // class B kế thừa class A
{
// Do not override this method any more
public sealed override void SomeMethod() { ; }
public override void SomeOtherMethod() { ; }
}
public class C : B // class C kế thừa class B
{
// You can’t override SomeMethod, since it declared as "sealed" in the base class
// public override void SomeMethod() { ; }
// But you can override SomeOtherMethod() if you want
public override void SomeOtherMethod() { ; }
}
[/code]
[…] Một lớp trừu tượng – abstract class không thể là một sealed class. […]
Theo như định nghĩa có câu “Trong 1 lớp đã được kế thừa bởi 1 lớp khác thì lớp đó không được sử dụng từ khóa sealed để khai báo cho phương thức”.
Vậy cho mình hỏi là Class B đã được Class C kế thừa nhưng Class B lại chứa method có từ khóa là sealed thì có bị lỗi hay không?
Bạn code test thử là biết mà
Theo như định nghĩa có câu: “Trong 1 lớp đã được kế thừa bởi 1 lớp khác thì lớp đó không được sử dụng từ khóa sealed để khai báo cho phương thức”.
Vậy cho mình hỏi là:
Class B đã được Class C kế thừa (public class C : B)
Nhưng bên trong class B có chứ method với từ khóa sealed (public sealed overide void SomeMethod)
Như vậy conflic với định nghĩa => có xảy ra lỗi gì không?
Không lỗi bạn nha. Lúc viết bài mình diễn đạt bị nhầm.
Mình đã update lại bài viết.
Cảm ơn bạn đã góp ý nhé!
sealed – co giong final trong java ko ?
Giống nhau đó bạn,
nhưng final trong Java thì có thể dùng với biến còn sealed thì không dùng với biến.