ইন্টারফেসেস এবং অ্যাবস্ট্রাক্ট ক্লাসেস (Interfaces & Abstract Classes)
ইন্টারফেস কী? (What Is an Interface?)
একটি ইন্টারফেসকে (interface) এক ধরনের চুক্তি (contract) হিসেবে ভাবতে পারেন। এটি বলে যে, "তুমি যদি এই চুক্তিতে সই করো, তবে তোমাকে কথা দিতে হবে যে তোমার কাছে এই নির্দিষ্ট মেথডগুলো (methods) এবং প্রোপার্টিগুলো (properties) থাকবে।" এটি আপনাকে কখনোই বলে দেয় না যে মেথডগুলো কীভাবে কাজ করবে — শুধু বলে দেয় যে আপনাকে অবশ্যই সেগুলো তৈরি করতে হবে।
একে একটি কাজের বিবরণী বা জব ডেসক্রিপশনের (job description) মতো ভাবতে পারেন। একজন "ড্রাইভারকে" অবশ্যই গাড়ি StartEngine(), Steer() এবং Stop() করতে পারতে হবে। সে গাড়ি, বাস নাকি মহাকাশযান (spaceship) চালাচ্ছে, তা এখানে গুরুত্বপূর্ণ নয় — তাদের সবাইকে একই কাজ করতে হয় বা একই চুক্তি পালন করতে হয়।
এটি কেন এত দরকারি? কারণ আপনি যখন এমন কোনো কোড লেখেন যা কিনা ওই ইন্টারফেসকে ইমপ্লিমেন্ট করা (implement) যেকোনো অবজেক্টের সাথেই কাজ করতে পারে, তখন আপনাকে সেই অবজেক্টের নির্দিষ্ট ধরন (type) নিয়ে আর ভাবতে হয় না। আপনার কোড শুধু বলে, "আমাকে এমন কিছু দাও যা চলতে (drive) পারে" আর তখন এটি নিজে থেকেই গাড়ি, বাস এবং স্পেসশিপ সবগুলোর সাথেই ঠিকঠাক কাজ করে।
ইন্টারফেসগুলো তৈরি করা এবং ইমপ্লিমেন্ট করা (Defining & Implementing Interfaces)
একাধিক ইন্টারফেস — একই সাথে অনেকগুলো দায়িত্ব পালন (Multiple Interfaces — Wear Many Hats)
একটি ক্লাস কেবল একটিমাত্র প্যারেন্ট ক্লাস (single inheritance) থেকে ইনহেরিট (inherit) করতে পারে, কিন্তু এটি চাইলে যেকোনো সংখ্যক ইন্টারফেসকে (interfaces) ইমপ্লিমেন্ট (implement) করতে পারে। এটি অনেকটা এমন একজন মানুষের মতো, যিনি একই সাথে একজন "সাঁতারু", একজন "দৌড়বিদ" এবং একজন "রাঁধুনি" — তিনি একই সাথে এই সবগুলো কাজের চুক্তি বা দায়িত্ব পালন করেন।
সি শার্পের ৮ম ভার্সন (C# 8) থেকে ইন্টারফেসগুলোতে ডিফল্ট ইমপ্লিমেন্টেশন (default implementations) যুক্ত করা হয়েছে — যার মানে হলো আপনি ইন্টারফেসের ভেতরেই সরাসরি কোনো মেথডের বডি (body) বা গঠন লিখে দিতে পারবেন। যেসব ক্লাস ওই ইন্টারফেসটিকে ইমপ্লিমেন্ট (implement) করে, তারা মেথডটি একদম বিনা পরিশ্রমে বা ডিফল্টভাবেই (default) পেয়ে যায়, তবে তারা চাইলে নিজেদের মতো করে মেথডটিকে পরিবর্তন বা ওভাররাইড (override) করে নিতে পারে।
একাধিক ইন্টারফেস এবং ডিফল্ট মেথডস (Multiple Interfaces & Default Methods)
অ্যাবস্ট্রাক্ট ক্লাস বনাম ইন্টারফেস — কখন কোনটি ব্যবহার করবেন? (Abstract Class vs Interface — When to Use Which?)
এদের দুজনকে দেখতে অনেকটা একই রকম মনে হলেও, নিচে এদের মূল পার্থক্যগুলো দেওয়া হলো:
- ইন্টারফেস (Interface): এটি হলো একটি খাঁটি চুক্তি (Pure contract)। এর নিজস্ব কোনো স্টেট (state) বা অবস্থা থাকে না (C# 8 এর ডিফল্টগুলো বাদ দিলে)। একটি ক্লাস চাইলে অনেকগুলো ইন্টারফেস ইমপ্লিমেন্ট করতে পারে। যখন একে অপরের সাথে সম্পর্কহীন ক্লাসগুলোর একই ধরনের ক্ষমতার প্রয়োজন হয় (যেমন- IPrintable), তখন এটি ব্যবহার করা উচিত।
- অ্যাবস্ট্রাক্ট ক্লাস (Abstract class): এটি হলো একটি আংশিক বা অর্ধেক তৈরি হওয়া ব্লুপ্রিন্ট (blueprint)। এর নিজস্ব ফিল্ডস (fields), কনস্ট্রাক্টর (constructors) এবং ইমপ্লিমেন্ট করা ও অ্যাবস্ট্রাক্ট (abstract) মেথড — উভয়ই থাকতে পারে। একটি ক্লাস কেবল একটিমাত্র অ্যাবস্ট্রাক্ট ক্লাস থেকে ইনহেরিট করতে পারে। যখন ক্লাসগুলোর মূল পরিচয় একই হয় (যেমন- সব ধরনের শেইপ বা Shapes), তখন এটি ব্যবহার করা উচিত।
সাধারণ নিয়ম (Rule of thumb): যদি সম্পর্কটি "কী করতে পারে (can do)" এমন হয় (যেমন- প্রিন্ট করতে পারে, সেভ করতে পারে), তবে ইন্টারফেস ব্যবহার করুন। আর যদি সম্পর্কটি "কী হয় (is a)" এমন হয় (যেমন- এটি একটি আকৃতি বা shape, এটি একটি প্রাণী বা animal), তবে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন।