কম্পিউটার টিউটোরিয়াল

C#-এ সিঙ্গলটন ক্লাস সবসময় sealed কেন?

sealed কিওয়ার্ড মানে ক্লাসটি ইনহেরিট করা যাবে না। প্রাইভেট কন্সট্রাক্টর ডিক্লেয়ার মানে ক্লাসের ইনস্ট্যান্স তৈরি করা যাবে না।

আপনার একটি বেস ক্লাস থাকতে পারে প্রাইভেট কন্সট্রাক্টর সহ, কিন্তু এখনও সেটা থেকে ইনহেরিট করা যায়, পাবলিক কন্সট্রাক্টর ডিফাইন করে, এবং বেস ক্লাসটি ইফেক্টিভলি ইনস্ট্যানসিয়েট করা যায়।

কন্সট্রাক্টর ইনহেরিট হয় না (তাই ডেরাইভড ক্লাসে সব প্রাইভেট কন্সট্রাক্টর থাকবে না শুধু বেস ক্লাসে থাকায়), এবং ডেরাইভড ক্লাসগুলো সবসময় বেস ক্লাসের কন্সট্রাক্টর প্রথমে কল করে।

ক্লাসকে sealed চিহ্নিত করা কাউকে আপনার সতর্কতার সাথে তৈরি করা সিঙ্গলটন ক্লাসকে সহজে ওয়ার্কঅরাউন্ড (work around) করার থেকে রোধ করে কারণ এটি ক্লাস থেকে ইনহেরিট করা বন্ধ করে দেয়।

উদাহরণ

static class Program
{
    static void Main(string[] args)
    {
        Singleton fromStudent = Singleton.GetInstance;
        fromStudent.PrintDetails("From Student");
        Singleton fromEmployee = Singleton.GetInstance;
        fromEmployee.PrintDetails("From Employee");
        Console.WriteLine("-------------------------------------");
        // নিচের লাইন কম্পাইল এরর দেবে যদি Singleton sealed থাকে
        // Singleton.DerivedSingleton derivedObj = new Singleton.DerivedSingleton();
        // derivedObj.PrintDetails("From Derived");
        Console.ReadLine();
    }
}
public class Singleton
{
    private static int counter = 0;
    private static object obj = new object();
    private Singleton()
    {
        counter++;
        Console.WriteLine("Counter Value " + counter.ToString());
    }
    private static Singleton instance = null;
    public static Singleton GetInstance
    {
        get
        {
            if (instance == null)
                instance = new Singleton();
            return instance;
        }
    }
    public void PrintDetails(string message) { Console.WriteLine(message); }
    // sealed না থাকলে নিচের ক্লাস ইনহেরিট করতে পারবে
    public class DerivedSingleton : Singleton { }
}

সঠিক সিঙ্গলটন ইমপ্লিমেন্টেশন (Thread-safe, sealed):

public sealed class Singleton
{
    private static readonly Lazy<Singleton> _instance = new Lazy<Singleton>(() => new Singleton());
    private Singleton() { }
    public static Singleton Instance => _instance.Value;
    public void PrintDetails(string message) => Console.WriteLine(message);
}

নোট: sealed ব্যবহার করা সিঙ্গলটন প্যাটার্নের অখণ্ডতা নিশ্চিত করে।

  1. জাভাস্ক্রিপ্টে 'class' কেন একটি রিজার্ভড ওয়ার্ড?

  2. অ্যান্ড্রয়েডে সিঙ্গলটন ক্লাস কীভাবে ব্যবহার করবেন?

  3. C# Console ক্লাস

  4. প্রোগ্রামিং-এ ক্লাসের গুরুত্ব: কোড সংগঠন এবং অ্যাবস্ট্রাকশন বাড়ানো