Sealed class คือ คลาสที่จำกัดการใช้งาน โดยจุดประสงค์ของคลาส sealed นั้นเพื่อป้องกันการสืบทอด (inheritance) หรือมีคลาสลูกได้ คลาสที่ประกาศเป็น sealed จะใช้ keyword คำว่า sealed นำหน้า class
ตัวอย่าง C#
publicsealedclassMySealedClass{publicvoidDisplayMessage() {Console.WriteLine("Hello from MySealedClass!"); }}
seal class ไม่สามารถนำมาเป็น base class ได้ ดังนั้นจึงไม่สามารถทำให้เป็น abstract class ได้เช่นกัน แต่สามารถใช้ sealed class ร่วมกันกับ method abstract class ได้
company หนึ่งที่มีข้อมูลในบริษัท จะมี class employee โดยบริษัทไม่ต้องการให้ employee เข้าถึงข้อมูลบางอย่าง เราจะใช้ sealed ในการป้องกันการสืบทอดนั้น
// คลาส Company ที่ไม่ต้องการให้ถูกสืบทอด
public sealed class Company
{
// ข้อมูลภายในบริษัท
private string companyName;
private string secretInfo; // ข้อมูลที่ไม่ต้องการให้เข้าถึง
public Company(string name, string secret)
{
companyName = name;
secretInfo = secret;
}
// เมธอดสำหรับแสดงชื่อบริษัท
public string GetCompanyName()
{
return companyName;
}
// เมธอดสำหรับเข้าถึงข้อมูลที่ไม่ต้องการให้เปิดเผย
// จะไม่เปิดเผย secretInfo ให้กับ Employee
private string GetSecretInfo()
{
return secretInfo;
}
}
// คลาส Employee
public class Employee
{
private string employeeName;
private Company company;
public Employee(string name, Company comp)
{
employeeName = name;
company = comp;
}
public void ShowEmployeeInfo()
{
Console.WriteLine($"Employee Name: {employeeName}");
Console.WriteLine($"Company Name: {company.GetCompanyName()}");
// ไม่สามารถเข้าถึงข้อมูล secretInfo ได้
// Console.WriteLine(company.GetSecretInfo()); // จะเกิดข้อผิดพลาด
}
}
public class Program
{
public static void Main()
{
Company myCompany = new Company("Tech Corp", "Top Secret Info");
Employee emp1 = new Employee("John Doe", myCompany);
emp1.ShowEmployeeInfo();
// Output:
// Employee Name: John Doe
// Company Name: Tech Corp
}
}
Abstract class
// คลาส Abstract
public abstract class Animal
{
public abstract void Speak(); // เมธอด abstract
}
// คลาสลูก
public class Dog : Animal
{
// Override เมธอด Speak และประกาศว่าเป็น sealed
public sealed override void Speak()
{
Console.WriteLine("Dog barks");
}
}
// คลาสลูกอีกคลาสที่ไม่สามารถ override Speak ได้
public class Puppy : Dog
{
// public override void Speak() { } // จะเกิดข้อผิดพลาด
}
public class Program
{
public static void Main()
{
Animal myDog = new Dog();
myDog.Speak(); // Output: Dog barks
Puppy myPuppy = new Puppy();
myPuppy.Speak(); // Output: Dog barks
}
}
เปรียบเทียบ Sealed class in JAVA and Python
JAVA
Class: จะประกาศ sealed หน้า class ตามด้วย permits และ กำหนดเฉพาะชื่อ class ที่ต้องการอนุญาติให้เข้าถึงได้sealed class ได้
ตัวอย่าง JAVA :class
public sealed class Company permits TechCompany, FinanceCompany {
private String companyName;
public Company(String name) {
this.companyName = name;
}
public String getCompanyName() {
return companyName;
}
}
// คลาสที่อนุญาตให้สืบทอด
public final class TechCompany extends Company {
public TechCompany(String name) {
super(name);
}
}
// อีกคลาสที่อนุญาตให้สืบทอด
public final class FinanceCompany extends Company {
public FinanceCompany(String name) {
super(name);
}
}
// คลาสที่ไม่สามารถสืบทอดจาก Company
// public class RetailCompany extends Company { } // จะเกิดข้อผิดพลาด
public class Main {
public static void main(String[] args) {
Company techCompany = new TechCompany("Tech Corp");
System.out.println("Company Name: " + techCompany.getCompanyName());
}
}
Interface: จะคล้ายกับ class เลย เพียงแต่จะใส่คำว่าหน้าคำว่า interface แล้วตามด้วย permits เช่นกัน
ตัวอย่าง JAVA : interface
public class TestExpressions {
public static void main(String[] args) {
// (6 + 7) * -8
System.out.println(
new TimesExpr(
new PlusExpr(new ConstantExpr(6), new ConstantExpr(7)),
new NegExpr(new ConstantExpr(8))
).eval());
}
}
sealed interface Expr
permits ConstantExpr, PlusExpr, TimesExpr, NegExpr {
public int eval();
}
final class ConstantExpr implements Expr {
int i;
ConstantExpr(int i) { this.i = i; }
public int eval() { return i; }
}
final class PlusExpr implements Expr {
Expr a, b;
PlusExpr(Expr a, Expr b) { this.a = a; this.b = b; }
public int eval() { return a.eval() + b.eval(); }
}
final class TimesExpr implements Expr {
Expr a, b;
TimesExpr(Expr a, Expr b) { this.a = a; this.b = b; }
public int eval() { return a.eval() * b.eval(); }
}
final class NegExpr implements Expr {
Expr e;
NegExpr(Expr e) { this.e = e; }
public int eval() { return -e.eval(); }
}
class SealedMeta(type):
def __init__(cls, name, bases, attrs):
super().__init__(name, bases, attrs)
if cls.__name__ != "Base":
raise TypeError(f"{cls.__name__} cannot be subclassed")
class Base(metaclass=SealedMeta):
# Members and methods
# Attempting to subclass will raise an error
try:
class Derived(Base):
pass
except TypeError as e:
print(e) # Output: Derived cannot be subclassed
ประโยชน์ของการใช้คลาส sealed
ป้องกันการสืบทอด
เพิ่มประสิทธิภาพในการ run time เนื่องจากการ sealed class ทำให้เกิดความรวดเร็วในการ compile