Using sealed class to Prevent Inheritance

อรปรียา บุดดี 650710593

Sealed class คืออะไร

Sealed class คือ คลาสที่จำกัดการใช้งาน โดยจุดประสงค์ของคลาส sealed นั้นเพื่อป้องกันการสืบทอด (inheritance) หรือมีคลาสลูกได้ คลาสที่ประกาศเป็น sealed จะใช้ keyword คำว่า sealed นำหน้า class

ตัวอย่าง C#

public sealed class MySealedClass
{
    public void DisplayMessage()
    {
        Console.WriteLine("Hello from MySealedClass!");
    }
}

seal class ไม่สามารถนำมาเป็น base class ได้ ดังนั้นจึงไม่สามารถทำให้เป็น abstract class ได้เช่นกัน แต่สามารถใช้ sealed class ร่วมกันกับ method abstract class ได้

ซึ่งการ sealed นั้น สามารถ ใช้กับ method, indexer, property หรือ event, ในคลาสลูกที่ Overriding แล้วจะทำให้คุณสมบัติของ virtual member จากคลาสพื้นฐานหมดไป และการประกาศ sealed นั้น จะใส่ไว้หน้าคำว่า override

การใช้งาน sealed class

  • Class ทั่วไป

ตัวอย่าง C#

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(); }
}

Python

ใน Python จะไม่ใช้คำว่า sealed โดยตรง แต่จะใช้การสร้าง Metaclass ขึ้นมาแทน เพราะ method __init__subclass__ สามารถที่จะควบคุมการสืบทอดของคลาสได้เช่นกัน

ตัวอย่าง Python

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

  • ควบคุมการใช้งานของโปรแกรมให้ชัดเจน

Slide

Video Presentation

Referenced

นำส่วนที่อธิบาย Sealed Class มาใช้
นำส่วนเพิ่มเติมของ method index propotyมาอธิบาย
นำส่วน code มาประยุกต์ใช้
ส่วนที่อธิบายเพิ่มเติมจาก class และ inheritance
นำส่วนที่ใช้แทน sealed class มาอธิบาย

Last updated