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

জাভাতে কখন অ্যাবস্ট্রাক্ট ক্লাস এবং কখন ইন্টারফেস ব্যবহার করবেন?


একটি ইন্টারফেস ব্যবহার করা যেতে পারে একটি কনট্রাক্ট বিহেভিয়ার ডিফাইন করার জন্য এবং এটি দুটি সিস্টেমের মধ্যে ইন্টারঅ্যাক্ট করার জন্য একটি কনট্রাক্ট হিসাবেও কাজ করতে পারে, যেখানে একটি অ্যাবস্ট্রাক্ট ক্লাস মূলত সাবক্লাসের জন্য ডিফল্ট বিহেভিয়ার ডিফাইন করার জন্য ব্যবহৃত হয়, অর্থাৎ সকল চাইল্ড ক্লাস একই ফাংশনালিটি পারফর্ম করবে।

কখন অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করবেন

  • যদি আমরা ইনহেরিটেন্স কনসেপ্ট ব্যবহার করি, তবে অ্যাবস্ট্রাক্ট ক্লাস একটি ভালো চয়েস কারণ এটি ডেরাইভড ক্লাসের জন্য একটি কমন বেস ক্লাস ইমপ্লিমেন্টেশন প্রদান করে।
  • যদি আমরা নন-পাবলিক মেম্বার ডিক্লেয়ার করতে চাই, তবে অ্যাবস্ট্রাক্ট ক্লাস ভালো। ইন্টারফেসে সব মেথড পাবলিক হতে হয়।
  • যদি ভবিষ্যতে নতুন মেথড যোগ করতে চাই, তবে অ্যাবস্ট্রাক্ট ক্লাস ভালো চয়েস। কারণ ইন্টারফেসে নতুন মেথড যোগ করলে, সেই ইন্টারফেসটি ইতিমধ্যে ইমপ্লিমেন্ট করা সকল ক্লাসকে নতুন মেথড ইমপ্লিমেন্ট করতে বাধ্য হতে হয়।
  • যদি আমাদের কম্পোনেন্টের একাধিক ভার্সন তৈরি করতে হয়, অ্যাবস্ট্রাক্ট ক্লাস তৈরি করুন। অ্যাবস্ট্রাক্ট ক্লাস আমাদের কম্পোনেন্ট ভার্সন করার একটি সহজ এবং সহজ পথ প্রদান করে। বেস ক্লাস আপডেট করলে, সকল ইনহেরিটিং ক্লাস অটোমেটিক্যালি পরিবর্তনের সাথে আপডেট হয়। ইন্টারফেস অন্যদিকে, একবার তৈরি হলে পরিবর্তন করা যায় না। নতুন ভার্সন প্রয়োজনে পুরো নতুন ইন্টারফেস তৈরি করতে হয়।
  • অ্যাবস্ট্রাক্ট ক্লাস बेटার ফরওয়ার্ড কম্প্যাটিবিলিটি দেয়। একবার ক্লায়েন্ট ইন্টারফেস ব্যবহার করলে, আমরা সেটি পরিবর্তন করতে পারি না; যদি অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করি, আমরা এক্সিস্টিং কোড ব্রেক না করেই নতুন বিহেভিয়ার যোগ করতে পারি।
  • যদি আমরা আমাদের কম্পোনেন্টের সকল ইমপ্লিমেন্টেশনের মধ্যে কমন, ইমপ্লিমেন্টেড ফাংশনালিটি প্রদান করতে চাই, অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন। অ্যাবস্ট্রাক্ট ক্লাস আমাদের ক্লাসটি আংশিকভাবে ইমপ্লিমেন্ট করতে দেয়, যেখানে ইন্টারফেস যেকোনো মেম্বারের জন্য কোনো ইমপ্লিমেন্টেশন ধারণ করে না।

উদাহরণ

abstract class Car {
    public void accelerate() {
        System.out.println("Do something to accelerate");
    }
    public void applyBrakes() {
        System.out.println("Do something to apply brakes");
    }
    public abstract void changeGears();
}

এখন, যে কোনো Car ইনস্ট্যানশিয়েট হতে চাইলে changeGears() মেথডটি ইমপ্লিমেন্ট করতে হবে।

class Alto extends Car {
    public void changeGears() {
        System.out.println("Implement changeGears() method for Alto Car");
    }
}
class Santro extends Car {
    public void changeGears() {
        System.out.println("Implement changeGears() method for Santro Car");
    }
}

কখন ইন্টারফেস ব্যবহার করবেন

  • যদি আমরা যে ফাংশনালিটি তৈরি করছি সেটি বিস্তৃত রেঞ্জের ভিন্ন ধরনের অবজেক্টের জন্য উপযোগী হয়, ইন্টারফেস ব্যবহার করুন। অ্যাবস্ট্রাক্ট ক্লাস মূলত বিষয়নির্ভর ক্লাসের জন্য ব্যবহার করা উচিত, যেখানে ইন্টারফেস অসম্পর্কিত ক্লাসগুলোর জন্য কমন ফাংশনালিটি প্রদান করার জন্য সেরা।
  • যদি আমরা মনে করি API দীর্ঘদিন পরিবর্তন হবে না, ইন্টারফেস ভালো চয়েস।
  • ইন্টারফেস তখনও ভালো যখন আমরা মাল্টিপল ইনহেরিটেন্সের মতো কিছু চাই, কারণ আমরা একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারি।
  • যদি আমরা ছোট, সংক্ষিপ্ত ফাংশনালিটি ডিজাইন করি, ইন্টারফেস ব্যবহার করুন। বড় ফাংশনাল ইউনিট ডিজাইন করলে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন।

উদাহরণ

public interface Actor {
    void perform();
}
public interface Producer {
    void invest();
}

আজকাল অধিকাংশ এক্টর নিজের মুভি প্রোডিউস করার জন্য পর্যাপ্ত সমৃদ্ধ। যদি আমরা অ্যাবস্ট্রাক্ট ক্লাসের বদলে ইন্টারফেস ব্যবহার করি, আমরা Actor এবং Producer দুটোই ইমপ্লিমেন্ট করতে পারি। এছাড়া আমরা একটি নতুন ActorProducer ইন্টারফেস ডিফাইন করতে পারি যা দুটোই এক্সটেন্ড করে।

public interface ActorProducer extends Actor, Producer{
    // some statements
}
  1. জাভাতে getClass() মেথড কখন ব্যবহার করবেন

  2. অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের পার্থক্য

  3. জাভাতে ইন্টারফেস

  4. জাভাতে অ্যাবস্ট্রাক্ট ক্লাস