1. ক্ষমতা

ইন্টারফেসের সুবিধাগুলি এবং সেগুলি কোথায় ব্যবহার করতে হবে তা আরও ভালভাবে বোঝার জন্য, আমাদের আরও কিছু বিমূর্ত জিনিস সম্পর্কে কথা বলতে হবে।

একটি ক্লাস সাধারণত একটি নির্দিষ্ট বস্তুর মডেল করে। একটি ইন্টারফেস বস্তুর সাথে কম এবং তাদের ক্ষমতা বা ভূমিকার সাথে বেশি মিল রাখে।

ইন্টারফেসের সারাংশ

উদাহরণস্বরূপ, গাড়ি, বাইক, মোটরসাইকেল এবং চাকার মতো জিনিসগুলি ক্লাস এবং অবজেক্ট হিসাবে সেরাভাবে উপস্থাপন করা হয়। কিন্তু তাদের ক্ষমতা - যেমন "আমি চড়তে পারি", "আমি লোক পরিবহন করতে পারি", "আমি দাঁড়াতে পারি" - ইন্টারফেস হিসাবে আরও ভালভাবে উপস্থাপন করা হয়। এখানে কিছু উদাহরণঃ:

কোড বর্ণনা
interface CanMove
{
   void move(String newLocation);
}
নড়াচড়া করার ক্ষমতার সাথে মিলে যায়
interface Rideable
{
   void ride(Passenger passenger);
}
অশ্বারোহণ করার ক্ষমতার সাথে মিলে যায়
interface CanTransport
{
   void addStuff(Object stuff);
   Object removeStuff();
}
জিনিসপত্র পরিবহন করার ক্ষমতার সাথে মিলে যায়
class Wheel implements CanMove
{
   ...
}
ক্লাস চলাফেরাWheel করতে পারে
class Car implements CanMove, Rideable, CanTransport
{
   ...
}
ক্লাস চলাফেরা Carকরতে পারে , চড়ে যেতে পারে এবং জিনিসপত্র পরিবহন করতে পারে
class Skateboard implements CanMove, Rideable
{
   ...
}
ক্লাস সরানো এবং আরোহণ করাSkateboard যাবে


2. ভূমিকা

ইন্টারফেসগুলি একজন প্রোগ্রামারের জীবনকে ব্যাপকভাবে সরল করে। খুব প্রায়ই, একটি প্রোগ্রামে হাজার হাজার অবজেক্ট থাকে, শত শত ক্লাস থাকে, কিন্তু মাত্র কয়েক ডজন ইন্টারফেস , যেমন ভূমিকা । কিছু ভূমিকা আছে, কিন্তু তাদের (শ্রেণী) একত্রিত করার অনেক উপায় আছে।

পুরো বিষয়টি হল যে প্রতিটি ক্লাসের সাথে ইন্টারঅ্যাক্ট করার জন্য আপনাকে প্রতিটি ক্লাসে কোড লিখতে হবে না। আপনাকে কেবল তাদের ভূমিকা (ইন্টারফেস) এর সাথে যোগাযোগ করতে হবে।

কল্পনা করুন আপনি একজন পোষা প্রাণী প্রশিক্ষক। আপনি যে পোষা প্রাণীর সাথে কাজ করেন তাদের প্রত্যেকের বিভিন্ন ক্ষমতা থাকতে পারে। আপনি আপনার প্রতিবেশীর সাথে বন্ধুত্বপূর্ণ তর্কের মধ্যে পড়েন যে কার পোষা প্রাণী সবচেয়ে বেশি শব্দ করতে পারে। বিষয়টি নিষ্পত্তি করার জন্য, আপনি কেবল "কথা বলতে" সমস্ত পোষা প্রাণীকে লাইন করুন এবং আপনি তাদের আদেশ দেন: কথা বলুন!

তারা কি ধরনের প্রাণী বা তাদের অন্য কোন ক্ষমতা আছে তা নিয়ে আপনি চিন্তা করবেন না। এমনকি যদি তারা ট্রিপল ব্যাক সোমারসল্ট করতে পারে। এই বিশেষ মুহুর্তে, আপনি কেবল তাদের উচ্চস্বরে কথা বলার ক্ষমতার প্রতি আগ্রহী। কোডে এটি দেখতে কেমন হবে তা এখানে:

কোড বর্ণনা
interface CanSpeak
{
   void speak();
}
সামর্থ্য CanSpeak। এই ইন্টারফেসটি তে কমান্ড বোঝে speak, যার অর্থ এটির একটি সংশ্লিষ্ট পদ্ধতি রয়েছে।
class Cat implements CanSpeak
{
   void speak()
   {
      println("MEOW");
   }
}

class Dog implements CanSpeak
{
   void speak()
   {
      println("WOOF");
   }
}

class Fish
{
   ...
}
এই বৈশিষ্ট্য আছে যে প্রাণী.

বোঝার সুবিধার্থে, আমরা ইংরেজিতে ক্লাসের নাম দিয়েছি। এটি জাভাতে অনুমোদিত, তবে এটি অত্যন্ত অবাঞ্ছিত।













আমাদের Fishকথা বলার ক্ষমতা নেই (ইন্টারফেস বাস্তবায়ন করে না CanSpeak)।

public static void main(String[] args)
{
   // Add all the animals to the list
   ArrayList pets = new ArrayList();
   pets.add(new Cat());
   pets.add(new Dog());
   pets.add(new Fish());

   // If the ability exists, then make a sound
   for(Object pet: pets)
   {
      if (pet instanceof CanSpeak)
      {
         CanSpeak loudmouth = (CanSpeak) pet;
         loudmouth.speak();
      }
   }
}
এবং কিভাবে আমরা তাদের আদেশ দিতে পারি?

যখন আপনার প্রোগ্রামে ক্লাসের সংখ্যা হাজারে পৌঁছাবে, তখন আপনি ইন্টারফেস ছাড়া বাঁচতে পারবেন না। হাজার হাজার ক্লাসের মিথস্ক্রিয়া বর্ণনা করার পরিবর্তে, কয়েক ডজন ইন্টারফেসের মিথস্ক্রিয়া বর্ণনা করাই যথেষ্ট - এটি জীবনকে ব্যাপকভাবে সরল করে।

এবং যখন পলিমরফিজমের সাথে মিলিত হয়, এই পদ্ধতিটি সাধারণত একটি চমকপ্রদ সাফল্য।



3. defaultইন্টারফেস পদ্ধতি বাস্তবায়ন

বিমূর্ত ক্লাসে ভেরিয়েবল এবং পদ্ধতির বাস্তবায়ন থাকতে পারে, কিন্তু তাদের একাধিক উত্তরাধিকার থাকতে পারে না। ইন্টারফেসে ভেরিয়েবল বা পদ্ধতির বাস্তবায়ন থাকতে পারে না, তবে এর একাধিক উত্তরাধিকার থাকতে পারে।

পরিস্থিতি নিম্নলিখিত টেবিলে প্রকাশ করা হয়:

ক্ষমতা/সম্পত্তি বিমূর্ত ক্লাস ইন্টারফেস
ভেরিয়েবল
পদ্ধতি বাস্তবায়ন
একাধিক উত্তরাধিকার

সুতরাং, কিছু প্রোগ্রামার সত্যিই ইন্টারফেসগুলিকে পদ্ধতি বাস্তবায়নের ক্ষমতা রাখতে চেয়েছিল। কিন্তু একটি পদ্ধতি বাস্তবায়ন যোগ করার ক্ষমতা থাকার মানে এই নয় যে একটি সবসময় যোগ করা হবে। আপনি চাইলে যোগ করুন। অথবা যদি আপনি না করেন, তাহলে করবেন না।

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

এখানে একটি আপডেট করা টেবিল (JDK 8 এবং তার বেশির জন্য):

ক্ষমতা/সম্পত্তি বিমূর্ত ক্লাস ইন্টারফেস
ভেরিয়েবল
পদ্ধতি বাস্তবায়ন
একাধিক উত্তরাধিকার

এখন বিমূর্ত ক্লাসের পাশাপাশি ইন্টারফেসের জন্য, আপনি বাস্তবায়নের সাথে বা ছাড়াই পদ্ধতি ঘোষণা করতে পারেন। এবং এই চমৎকার খবর!

অ্যাবস্ট্রাক্ট ক্লাসে, কোন ইমপ্লিমেন্টেশন ব্যতীত মেথডগুলিকে abstractকীওয়ার্ডের আগে থাকতে হবে। একটি বাস্তবায়নের সাথে পদ্ধতির আগে আপনাকে কিছু যোগ করার দরকার নেই। ইন্টারফেসে, বিপরীত সত্য। যদি একটি পদ্ধতির একটি বাস্তবায়ন না থাকে, তাহলে কিছুই যোগ করা উচিত নয়। কিন্তু যদি ইমপ্লিমেন্টেশন থাকে তাহলে defaultকিওয়ার্ড যোগ করতে হবে।

সরলতার জন্য, আমরা নিম্নলিখিত ছোট টেবিলে এই তথ্য উপস্থাপন করি:

ক্ষমতা/সম্পত্তি বিমূর্ত ক্লাস ইন্টারফেস
কোন বাস্তবায়ন ছাড়া পদ্ধতি abstract -
একটি বাস্তবায়ন সঙ্গে পদ্ধতি - default

সমস্যা

ইন্টারফেসগুলি ব্যবহার করে যেখানে পদ্ধতি রয়েছে তা বৃহৎ শ্রেণির শ্রেণিবিন্যাসকে ব্যাপকভাবে সরল করতে পারে। উদাহরণস্বরূপ, বিমূর্ত InputStreamএবং OutputStreamক্লাসগুলিকে ইন্টারফেস হিসাবে ঘোষণা করা যেতে পারে! এটি আমাদেরকে অনেক বেশি ঘন ঘন এবং আরও সুবিধাজনকভাবে ব্যবহার করতে দেয়।

কিন্তু ইতিমধ্যে বিশ্বে কয়েক মিলিয়ন (বিলিয়ন?) জাভা ক্লাস রয়েছে। এবং আপনি যদি স্ট্যান্ডার্ড লাইব্রেরি পরিবর্তন করা শুরু করেন, তাহলে আপনি কিছু ভেঙ্গে ফেলতে পারেন। সবকিছু ভালো লেগেছে! 😛

ভুলবশত বিদ্যমান প্রোগ্রাম এবং লাইব্রেরিগুলিকে ভেঙে না দেওয়ার জন্য, এটি সিদ্ধান্ত নেওয়া হয়েছিল যে ইন্টারফেসে পদ্ধতি বাস্তবায়নের সর্বনিম্ন উত্তরাধিকার অগ্রাধিকার থাকবে ।

উদাহরণস্বরূপ, যদি একটি ইন্টারফেস অন্য ইন্টারফেসকে উত্তরাধিকার সূত্রে পায় যার একটি পদ্ধতি রয়েছে এবং প্রথম ইন্টারফেসটি একই পদ্ধতি ঘোষণা করে কিন্তু একটি বাস্তবায়ন ছাড়াই, তাহলে উত্তরাধিকারসূত্রে প্রাপ্ত ইন্টারফেস থেকে পদ্ধতি বাস্তবায়ন উত্তরাধিকারী ইন্টারফেসে পৌঁছাবে না। উদাহরণ:

interface Pet
{
   default void meow()
   {
      System.out.println("Meow");
   }
}

interface Cat extends Pet
{
   void meow(); // Here we override the default implementation by omitting an implementation
}

class Tom implements Cat
{
}

কোডটি কম্পাইল হবে না কারণ Tomক্লাস পদ্ধতিটি বাস্তবায়ন করে না meow()