CodeGym/Java Blog/এলোমেলো/জাভা পলিমরফিজম
John Squirrels
লেভেল 41
San Francisco

জাভা পলিমরফিজম

এলোমেলো দলে প্রকাশিত
সদস্যগণ
OOP-সম্পর্কিত প্রশ্নগুলি একটি আইটি কোম্পানিতে জাভা বিকাশকারী পদের জন্য প্রযুক্তিগত সাক্ষাৎকারের একটি অবিচ্ছেদ্য অংশ। এই নিবন্ধে, আমরা OOP-এর একটি নীতি সম্পর্কে কথা বলব - পলিমরফিজম। আমরা সাক্ষাত্কারের সময় যে দিকগুলি সম্পর্কে প্রায়শই জিজ্ঞাসা করা হয় সেগুলির উপর ফোকাস করব এবং স্পষ্টতার জন্য কয়েকটি উদাহরণও দেব।

জাভাতে পলিমরফিজম কি?

পলিমরফিজম হল একটি প্রোগ্রামের ক্ষমতা যা বস্তুর নির্দিষ্ট ধরন সম্পর্কে তথ্য ছাড়াই একই ইন্টারফেসের সাথে বস্তুর সাথে একইভাবে আচরণ করে। আপনি যদি পলিমারফিজম কী সে সম্পর্কে একটি প্রশ্নের উত্তর দেন, তাহলে সম্ভবত আপনি কী বোঝাতে চেয়েছেন তা ব্যাখ্যা করতে বলা হবে। একগুচ্ছ অতিরিক্ত প্রশ্ন ট্রিগার না করে, সাক্ষাত্কারকারীর জন্য আবারও এটি সব করে দিন। সাক্ষাৎকারের সময়: জাভাতে পলিমরফিজম - 1আপনি এই সত্যটি দিয়ে শুরু করতে পারেন যে OOP পদ্ধতিতে অবজেক্টের মধ্যে মিথস্ক্রিয়ার উপর ভিত্তি করে একটি জাভা প্রোগ্রাম তৈরি করা জড়িত, যা ক্লাসের উপর ভিত্তি করে। ক্লাসগুলি পূর্বে লিখিত ব্লুপ্রিন্ট (টেমপ্লেট) যা প্রোগ্রামে বস্তু তৈরি করতে ব্যবহৃত হয়। তদুপরি, একটি ক্লাস সবসময় একটি নির্দিষ্ট ধরন থাকে, যা ভাল প্রোগ্রামিং শৈলীর সাথে একটি নাম থাকে যা এর উদ্দেশ্য নির্দেশ করে। আরও, এটি লক্ষ করা যেতে পারে যে যেহেতু জাভা দৃঢ়ভাবে টাইপ করা হয়, তাই যখন ভেরিয়েবল ঘোষণা করা হয় তখন প্রোগ্রাম কোডকে অবশ্যই একটি অবজেক্ট টাইপ নির্দিষ্ট করতে হবে। এর সাথে যোগ করুন যে কঠোর টাইপিং কোডের নিরাপত্তা এবং নির্ভরযোগ্যতা উন্নত করে, এবং এটি সম্ভব করে তোলে, এমনকি সংকলনের সময়ও, অসঙ্গতি প্রকারের কারণে ত্রুটি প্রতিরোধ করা (উদাহরণস্বরূপ, একটি স্ট্রিংকে একটি সংখ্যা দ্বারা ভাগ করার চেষ্টা)। স্বাভাবিকভাবেই, কম্পাইলার অবশ্যই "জানা" ঘোষিত প্রকার - এটি JDK থেকে বা আমরা নিজেরাই তৈরি করা একটি ক্লাস হতে পারে। সাক্ষাত্কারকারীকে নির্দেশ করুন যে আমাদের কোড শুধুমাত্র ঘোষণায় নির্দেশিত ধরণের বস্তুই ব্যবহার করতে পারে না বরং এর বংশধরদেরও ব্যবহার করতে পারে।এটি একটি গুরুত্বপূর্ণ বিষয়: আমরা একটি একক টাইপ হিসাবে বিভিন্ন ধরণের সাথে কাজ করতে পারি (প্রদান করা হয় যে এই প্রকারগুলি একটি বেস টাইপ থেকে উদ্ভূত হয়)। এর মানে হল যে যদি আমরা একটি ভেরিয়েবল ঘোষণা করি যার ধরন একটি সুপারক্লাস, তাহলে আমরা সেই ভেরিয়েবলের জন্য তার বংশধরদের একটির একটি উদাহরণ বরাদ্দ করতে পারি। উদাহরণ দিলে ইন্টারভিউয়ার ভালো লাগবে। এমন কিছু শ্রেণী নির্বাচন করুন যা বিভিন্ন শ্রেণীর দ্বারা ভাগ করা যেতে পারে (এর জন্য একটি বেস ক্লাস) এবং তাদের মধ্যে কয়েকটিকে উত্তরাধিকারী করুন। বেস ক্লাস:
public class Dancer {
    private String name;
    private int age;

    public Dancer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void dance() {
        System.out.println(toString() + " I dance like everyone else.");
    }

    @Override
    public String toString() {
        Return "I'm " + name + ". I'm " + age + " years old.";
    }
}
সাবক্লাসে, বেস ক্লাসের পদ্ধতি ওভাররাইড করুন:
public class ElectricBoogieDancer extends Dancer {
    public ElectricBoogieDancer(String name, int age) {
        super(name, age);
    }
// Override the method of the base class
    @Override
    public void dance() {
        System.out.println(toString () + " I dance the electric boogie!");
    }
}

public class Breakdancer extends Dancer {

    public Breakdancer(String name, int age) {
        super(name, age);
    }
// Override the method of the base class
    @Override
    public void dance() {
        System.out.println(toString() + " I breakdance!");
    }
}
পলিমারফিজমের একটি উদাহরণ এবং কীভাবে এই বস্তুগুলি একটি প্রোগ্রামে ব্যবহার করা যেতে পারে:
public class Main {

    public static void main(String[] args) {
        Dancer dancer = new Dancer("Fred", 18);

        Dancer breakdancer = new Breakdancer("Jay", 19); // Widening conversion to the base type
        Dancer electricBoogieDancer = new ElectricBoogieDancer("Marcia", 20); // Widening conversion to the base type

        List<dancer> disco = Arrays.asList(dancer, breakdancer, electricBoogieDancer);
        for (Dancer d : disco) {
            d.dance(); // Call the polymorphic method
        }
    }
}
মূল পদ্ধতিতে , লাইনগুলি দেখান
Dancer breakdancer = new Breakdancer("Jay", 19);
Dancer electricBoogieDancer = new ElectricBoogieDancer("Marcia", 20);
একটি সুপারক্লাসের একটি পরিবর্তনশীল ঘোষণা করুন এবং এটিকে একটি অবজেক্ট বরাদ্দ করুন যা তার বংশধরদের একটির উদাহরণ। আপনাকে সম্ভবত জিজ্ঞাসা করা হবে কেন অ্যাসাইনমেন্ট অপারেটরের বাম এবং ডান দিকে ঘোষিত প্রকারের অসঙ্গতিতে কম্পাইলারটি উল্টে যায় না — সর্বোপরি, জাভা দৃঢ়ভাবে টাইপ করা হয়। ব্যাখ্যা করুন যে একটি প্রসারিত টাইপ রূপান্তর এখানে কাজ করছে — একটি বস্তুর একটি রেফারেন্স তার বেস ক্লাসের একটি রেফারেন্স হিসাবে বিবেচনা করা হয়। আরও কী, কোডে এমন একটি নির্মাণের সম্মুখীন হওয়ার পরে, কম্পাইলার স্বয়ংক্রিয়ভাবে এবং অন্তর্নিহিতভাবে রূপান্তর সম্পাদন করে। নমুনা কোড দেখায় যে অ্যাসাইনমেন্ট অপারেটরের বাম দিকে ঘোষিত টাইপ ( ডান্সার ) এর একাধিক ফর্ম (টাইপ) রয়েছে যা ডানদিকে ঘোষণা করা হয়েছে ( ব্রেকডান্সার , ইলেকট্রিকবুগি ড্যান্সার) সুপারক্লাসে ( নৃত্যের পদ্ধতি) সংজ্ঞায়িত সাধারণ কার্যকারিতার ক্ষেত্রে প্রতিটি ফর্মের নিজস্ব অনন্য আচরণ থাকতে পারে। অর্থাৎ, সুপারক্লাসে ঘোষিত একটি পদ্ধতি তার বংশধরদের মধ্যে ভিন্নভাবে প্রয়োগ করা যেতে পারে। এই ক্ষেত্রে, আমরা মেথড ওভাররাইডিং নিয়ে কাজ করছি, যা ঠিক একইভাবে একাধিক ফর্ম (আচরণ) তৈরি করে। এটি মূল পদ্ধতিতে কোড চালানোর মাধ্যমে দেখা যেতে পারে: প্রোগ্রাম আউটপুট: আমি ফ্রেড। আমি 18 বছর বয়সী. আমিও সবার মতো নাচছি। আমি জে. আমি 19 বছর বয়সী. আমি ব্রেকডান্স! আমি মার্সিয়া। আমার ২ 0 বছর. আমি বৈদ্যুতিক বুগি নাচ! যদি আমরা সাবক্লাসে পদ্ধতিটিকে ওভাররাইড না করি, তাহলে আমরা ভিন্ন আচরণ পাব না। উদাহরণ স্বরূপ,ElectricBoogieDancer ক্লাস, তারপর প্রোগ্রামের আউটপুট এই হবে: আমি ফ্রেড. আমি 18 বছর বয়সী. আমিও সবার মতো নাচছি। আমি জে. আমি 19 বছর বয়সী. আমিও সবার মতো নাচছি। আমি মার্সিয়া। আমার ২ 0 বছর. আমিও সবার মতো নাচছি। এবং এর মানে হল যে ব্রেকডান্সার এবং ইলেকট্রিকবুগি ড্যান্সার ক্লাস তৈরি করা সহজভাবে বোঝা যায় না । পলিমরফিজমের নীতি কোথায় বিশেষভাবে প্রকাশ পায়? কোথায় একটি বস্তু তার নির্দিষ্ট ধরনের জ্ঞান ছাড়া প্রোগ্রাম ব্যবহার করা হয়? আমাদের উদাহরণে, এটি ঘটে যখন dance() পদ্ধতিটি Dancer d অবজেক্টে কল করা হয় । জাভাতে, পলিমরফিজম মানে হল যে প্রোগ্রামটি অবজেক্টটি কিনা তা জানতে হবে নাব্রেকডান্সার বা ইলেকট্রিকবুগি ড্যান্সারগুরুত্বপূর্ণ বিষয় হল এটি নর্তকী শ্রেণীর বংশধর । এবং যদি আপনি বংশধরদের উল্লেখ করেন, তাহলে আপনার মনে রাখা উচিত যে জাভাতে উত্তরাধিকার শুধুমাত্র প্রসারিত নয় , কিন্তু প্রয়োগও করে. এখন উল্লেখ করার সময় এসেছে যে জাভা একাধিক উত্তরাধিকার সমর্থন করে না — প্রতিটি প্রকারের একটি পিতামাতা (সুপারক্লাস) এবং সীমাহীন সংখ্যক বংশধর (সাবক্লাস) থাকতে পারে। তদনুসারে, ক্লাসে একাধিক সেট ফাংশন যোগ করতে ইন্টারফেস ব্যবহার করা হয়। সাবক্লাসের (উত্তরাধিকার) তুলনায় ইন্টারফেসগুলি অভিভাবক শ্রেণীর সাথে কম মিলিত হয়। তারা খুব ব্যাপকভাবে ব্যবহৃত হয়. জাভাতে, একটি ইন্টারফেস একটি রেফারেন্স টাইপ, তাই প্রোগ্রামটি ইন্টারফেসের প্রকারের একটি পরিবর্তনশীল ঘোষণা করতে পারে। এখন উদাহরণ দেওয়ার পালা। একটি ইন্টারফেস তৈরি করুন:
public interface CanSwim {
    void swim();
}
স্বচ্ছতার জন্য, আমরা বিভিন্ন অসংলগ্ন ক্লাস নেব এবং সেগুলিকে ইন্টারফেস বাস্তবায়ন করব:
public class Human implements CanSwim {
    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void swim() {
        System.out.println(toString()+" I swim with an inflated tube.");
    }

    @Override
    public String toString() {
        return "I'm " + name + ". I'm " + age + " years old.";
    }

}

public class Fish implements CanSwim {
    private String name;

    public Fish(String name) {
        this.name = name;
    }

    @Override
    public void swim() {
        System.out.println("I'm a fish. My name is " + name + ". I swim by moving my fins.");

    }

public class UBoat implements CanSwim {

    private int speed;

    public UBoat(int speed) {
        this.speed = speed;
    }

    @Override
    public void swim() {
        System.out.println("I'm a submarine that swims through the water by rotating screw propellers. My speed is " + speed + " knots.");
    }
}
প্রধান পদ্ধতি:
public class Main {

    public static void main(String[] args) {
        CanSwim human = new Human("John", 6);
        CanSwim fish = new Fish("Whale");
        CanSwim boat = new UBoat(25);

        List<swim> swimmers = Arrays.asList(human, fish, boat);
        for (Swim s : swimmers) {
            s.swim();
        }
    }
}
একটি ইন্টারফেসে সংজ্ঞায়িত একটি পলিমরফিক পদ্ধতি কল করার ফলাফলগুলি আমাদের এই ইন্টারফেসটি বাস্তবায়নকারী প্রকারের আচরণের পার্থক্য দেখায়। আমাদের ক্ষেত্রে, এগুলি সাঁতারের পদ্ধতি দ্বারা প্রদর্শিত বিভিন্ন স্ট্রিং। আমাদের উদাহরণ অধ্যয়ন করার পরে, সাক্ষাত্কারকারী জিজ্ঞাসা করতে পারেন কেন এই কোডটি মূল পদ্ধতিতে চালাচ্ছেন
for (Swim s : swimmers) {
            s.swim();
}
আমাদের সাবক্লাসে সংজ্ঞায়িত ওভাররাইডিং পদ্ধতিগুলিকে বলা হয়? প্রোগ্রাম চলাকালীন পদ্ধতির কাঙ্ক্ষিত বাস্তবায়ন কিভাবে নির্বাচন করা হয়? এই প্রশ্নের উত্তর দিতে, আপনাকে দেরী (গতিশীল) বাঁধাই ব্যাখ্যা করতে হবে। বাইন্ডিং মানে একটি পদ্ধতি কল এবং এর নির্দিষ্ট শ্রেণী বাস্তবায়নের মধ্যে একটি ম্যাপিং স্থাপন করা। সংক্ষেপে, কোডটি নির্ধারণ করে যে ক্লাসে সংজ্ঞায়িত তিনটি পদ্ধতির মধ্যে কোনটি কার্যকর করা হবে। জাভা ডিফল্টভাবে লেট বাইন্ডিং ব্যবহার করে, অর্থাৎ বাইন্ডিং রানটাইমে হয় এবং কম্পাইল টাইমে হয় না, যেমনটা হয় আর্লি বাইন্ডিংয়ের ক্ষেত্রে। এর মানে হল যখন কম্পাইলার এই কোড কম্পাইল করে
for (Swim s : swimmers) {
            s.swim();
}
কোন শ্রেণীর ( মানুষ , মাছ , বা ইউবোট ) কোড আছে যা সাঁতার কাটলে কার্যকর করা হবে তা জানে নাপদ্ধতি বলা হয়। এটি শুধুমাত্র তখনই নির্ধারিত হয় যখন প্রোগ্রামটি কার্যকর করা হয়, ডাইনামিক বাইন্ডিং মেকানিজমকে ধন্যবাদ (রানটাইমে একটি বস্তুর ধরন পরীক্ষা করা এবং এই ধরনের জন্য সঠিক বাস্তবায়ন নির্বাচন করা)। যদি আপনাকে জিজ্ঞাসা করা হয় যে এটি কীভাবে প্রয়োগ করা হয়, আপনি উত্তর দিতে পারেন যে অবজেক্টগুলি লোড করার এবং শুরু করার সময়, JVM মেমরিতে টেবিল তৈরি করে এবং ভেরিয়েবলকে তাদের মান এবং বস্তুর সাথে তাদের পদ্ধতির সাথে লিঙ্ক করে। এটি করার সময়, যদি একটি ক্লাস উত্তরাধিকারসূত্রে প্রাপ্ত হয় বা একটি ইন্টারফেস প্রয়োগ করে, ব্যবসার প্রথম আদেশটি ওভাররাইড করা পদ্ধতিগুলির উপস্থিতি পরীক্ষা করা। যদি কোন থাকে, তারা এই ধরনের আবদ্ধ হয়. যদি তা না হয়, একটি মিলিত পদ্ধতির জন্য অনুসন্ধানটি ক্লাসে চলে যায় যা এক ধাপ উপরে (অভিভাবক) এবং বহুস্তরীয় শ্রেণিবিন্যাসে রুট পর্যন্ত। যখন OOP-তে পলিমরফিজম এবং কোডে এর বাস্তবায়নের কথা আসে, আমরা লক্ষ্য করি যে বেস ক্লাসের বিমূর্ত সংজ্ঞা প্রদান করতে বিমূর্ত ক্লাস এবং ইন্টারফেসগুলি ব্যবহার করা ভাল অনুশীলন। এই অনুশীলনটি বিমূর্তকরণের নীতি থেকে অনুসরণ করে — সাধারণ আচরণ এবং বৈশিষ্ট্যগুলিকে চিহ্নিত করা এবং তাদের একটি বিমূর্ত শ্রেণিতে রাখা, বা শুধুমাত্র সাধারণ আচরণকে চিহ্নিত করা এবং এটিকে একটি ইন্টারফেসে রাখা। পলিমরফিজম বাস্তবায়নের জন্য ইন্টারফেস এবং শ্রেণী উত্তরাধিকারের উপর ভিত্তি করে একটি অবজেক্ট হায়ারার্কি ডিজাইন এবং তৈরি করা প্রয়োজন। জাভাতে পলিমরফিজম এবং উদ্ভাবন সম্পর্কে, আমরা নোট করি যে জাভা 8 দিয়ে শুরু করে, বিমূর্ত ক্লাস এবং ইন্টারফেস তৈরি করার সময় এটি ব্যবহার করা সম্ভব অথবা শুধুমাত্র সাধারণ আচরণ সনাক্ত করা এবং এটি একটি ইন্টারফেসে রাখা। পলিমরফিজম বাস্তবায়নের জন্য ইন্টারফেস এবং শ্রেণী উত্তরাধিকারের উপর ভিত্তি করে একটি অবজেক্ট হায়ারার্কি ডিজাইন এবং তৈরি করা প্রয়োজন। জাভাতে পলিমরফিজম এবং উদ্ভাবন সম্পর্কে, আমরা নোট করি যে জাভা 8 দিয়ে শুরু করে, বিমূর্ত ক্লাস এবং ইন্টারফেস তৈরি করার সময় এটি ব্যবহার করা সম্ভব অথবা শুধুমাত্র সাধারণ আচরণ সনাক্ত করা এবং এটি একটি ইন্টারফেসে রাখা। পলিমরফিজম বাস্তবায়নের জন্য ইন্টারফেস এবং শ্রেণী উত্তরাধিকারের উপর ভিত্তি করে একটি অবজেক্ট হায়ারার্কি ডিজাইন এবং তৈরি করা প্রয়োজন। জাভাতে পলিমরফিজম এবং উদ্ভাবন সম্পর্কে, আমরা নোট করি যে জাভা 8 দিয়ে শুরু করে, বিমূর্ত ক্লাস এবং ইন্টারফেস তৈরি করার সময় এটি ব্যবহার করা সম্ভববেস ক্লাসে বিমূর্ত পদ্ধতির জন্য একটি ডিফল্ট বাস্তবায়ন লিখতে ডিফল্ট কীওয়ার্ড। উদাহরণ স্বরূপ:
public interface CanSwim {
    default void swim() {
        System.out.println("I just swim");
    }
}
কখনও কখনও সাক্ষাত্কারকারীরা জিজ্ঞাসা করে যে কীভাবে বেস ক্লাসে পদ্ধতিগুলি ঘোষণা করা উচিত যাতে পলিমারফিজমের নীতি লঙ্ঘন না হয়। উত্তরটি সহজ: এই পদ্ধতিগুলি স্থির , ব্যক্তিগত বা চূড়ান্ত হতে হবে না । প্রাইভেট শুধুমাত্র একটি ক্লাসের মধ্যে একটি পদ্ধতি উপলব্ধ করে, তাই আপনি এটিকে একটি সাবক্লাসে ওভাররাইড করতে সক্ষম হবেন না। স্ট্যাটিক কোনো বস্তুর পরিবর্তে একটি পদ্ধতিকে ক্লাসের সাথে সংযুক্ত করে, তাই সুপারক্লাসের পদ্ধতিকে সর্বদা বলা হবে। এবং চূড়ান্ত একটি পদ্ধতিকে অপরিবর্তনীয় এবং উপশ্রেণী থেকে লুকিয়ে রাখে।

পলিমরফিজম আমাদের কী দেয়?

পলিমারফিজম আমাদের কীভাবে উপকার করে সে সম্পর্কে আপনাকে সম্ভবত জিজ্ঞাসা করা হবে। লোমশ বিবরণে আটকা না পড়ে আপনি সংক্ষেপে এর উত্তর দিতে পারেন:
  1. এটি ক্লাস বাস্তবায়ন প্রতিস্থাপন করা সম্ভব করে তোলে। এর উপর তৈরি করা হয়েছে পরীক্ষা।
  2. এটি সম্প্রসারণযোগ্যতাকে সহজতর করে, এটি একটি ভিত্তি তৈরি করা আরও সহজ করে যা ভবিষ্যতে তৈরি করা যেতে পারে। বিদ্যমানগুলির উপর ভিত্তি করে নতুন ধরনের যোগ করা হল OOP প্রোগ্রামগুলির কার্যকারিতা প্রসারিত করার সবচেয়ে সাধারণ উপায়।
  3. এটি আপনাকে এমন বস্তুগুলিকে একত্রিত করতে দেয় যা একটি সাধারণ ধরন বা আচরণকে একটি সংগ্রহ বা অ্যারেতে ভাগ করে এবং সেগুলিকে সমানভাবে পরিচালনা করে (আমাদের উদাহরণগুলির মতো, যেখানে আমরা প্রত্যেককে নাচতে বাধ্য করে() বা সাঁতার কাটতে() :)
  4. নতুন ধরনের তৈরিতে নমনীয়তা: আপনি একটি পদ্ধতির অভিভাবকের বাস্তবায়নের জন্য বেছে নিতে পারেন বা এটিকে একটি সাবক্লাসে ওভাররাইড করতে পারেন।

কিছু বিচ্ছেদ শব্দ

পলিমরফিজম একটি অত্যন্ত গুরুত্বপূর্ণ এবং বিস্তৃত বিষয়। এটি জাভাতে OOP-তে এই নিবন্ধের প্রায় অর্ধেক বিষয় এবং এটি ভাষার ভিত্তির একটি ভাল অংশ গঠন করে। আপনি একটি সাক্ষাত্কারে এই নীতিটি সংজ্ঞায়িত এড়াতে সক্ষম হবেন না। আপনি যদি এটি না জানেন বা এটি বুঝতে না পারেন, তাহলে সাক্ষাত্কারটি সম্ভবত শেষ হয়ে যাবে। তাই অলস হবেন না — সাক্ষাত্কারের আগে আপনার জ্ঞানের মূল্যায়ন করুন এবং প্রয়োজনে তা রিফ্রেশ করুন।
মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই