কারণ
ইন্টারফেস হলো কন্ট্রাক্ট (Contract) — এটি বাহিরের জগতের সাথে চুক্তি করে যে এই ইন্টারফেস ইমপ্লিমেন্ট করা ক্লাস নির্দিষ্ট কিছু কাজ করবে। ইন্টারফেস মেম্বারগুলো পাবলিক হওয়া বাধ্যতামূলক, কারণ ইন্টারফেসের উদ্দেশ্য হলো অন্য টাইপগুলোর ক্লাস বা স্ট্রাক্ট অ্যাক্সেস করতে দেয়া।
ইতিহাস: C# 8.0 এর আগে vs পর
| ভার্সন | নियम |
| C# 7.3 এবং আগে | ইন্টারফেস মেম্বার শুধু public হতে পারে (অন্য মডিফায়ার দিলে কম্পাইল এরর) |
| C# 8.0+ | private, protected, internal, private protected দেওয়া যায় (প্রাইভেট মেথড, ডিফল্ট ইমপ্লিমেন্টেশন ইত্যাদি) |
উদাহরণ: C# 7.0-এ এরর
interface IInterface {
public void Save(); // ❌ Compiler Error: 'public' modifier not allowed
}
উদাহরণ: C# 8.0+ — ডিফল্ট ইমপ্লিমেন্টেশন ও প্রাইভেট মেথড
interface ILogger {
// ডিফল্ট ইমপ্লিমেন্টেশন (public)
public void Log(string message) {
WriteToConsole(message); // প্রাইভেট মেথড কল
}
// প্রাইভেট হেল্পার মেথড (ইন্টারফেসের ভিতরে)
private void WriteToConsole(string message) {
Console.WriteLine($"[LOG] {message}");
}
// Static মেথডও সম্ভব
public static void LogHeader() => Console.WriteLine("=== Log Start ===");
}
class MyLogger : ILogger { } // কোনো ইমপ্লিমেন্টেশন লিখতে হয়নি
class Program {
static void Main() {
ILogger logger = new MyLogger();
logger.Log("Hello"); // [LOG] Hello
ILogger.LogHeader(); // === Log Start ===
}
}
C# 8.0+ এ ইন্টারফেসে অনুমোদিত মডিফায়ার
| মডিফায়ার | ব্যবহার |
| public | পাবলিক API (ডিফল্ট) |
| private | শুধু ইন্টারফেসের ভিতরে ব্যবহার (হেল্পার) |
| protected | ইমপ্লিমেন্ট করা ক্লাস/ডেরাইভড ক্লাস থেকে অ্যাক্সেস |
| internal | একই অ্যাসেম্বলির মধ্যে |
| private protected | একই অ্যাসেম্বলির ডেরাইভড ক্লাস |
| static | স্ট্যাটিক মেথড/প্রপার্টি (C# 8.0+) |
মনে রাখার কথা
- ইন্টারফেসের পাবলিক কন্ট্রাক্ট হলো এর মূল উদ্দেশ্য
- C# 8.0+ এর ফিচারগুলো (private, default impl) ব্যবহার করলে লিগেসি কোড ব্রেক হতে পারে
- অবস্ট্রাক্ট ক্লাস ব্যবহার করুন যদি শেয়ার্ড স্টেট বা প্রটেক্টেড মেম্বার দরকার হয়