Lập trình C#

Từ khóa sealed – niêm phong trong C#

Từ khóa sealed - niêm phong trong C#
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

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#.

1. Từ khóa sealed là gì?
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
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?
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
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:

[code language=”csharp” highlight=”1″] sealed class 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:

[code language=”csharp” highlight=”11″] public class 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]

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

7 bình luận

  • 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?

  • 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é!

    • 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.

Translate »