ওহে! জাভাতে বিমূর্ত ক্লাস সম্পর্কে কথা বলা যাক ।জাভাতে বিমূর্ত ক্লাসের কংক্রিট উদাহরণ - 1

কেন ক্লাস "বিমূর্ত" বলা হয়?

আপনি সম্ভবত বিমূর্ততা কি মনে রাখবেন — আমরা এটা আগে আলোচনা :) আপনি যদি ভুলে যান, কোন চিন্তা নেই. মনে রাখবেন, এটি একটি OOP নীতি যা বলে, ক্লাস ডিজাইন করার সময় এবং অবজেক্ট তৈরি করার সময়, আপনাকে শুধুমাত্র সত্তার প্রধান বৈশিষ্ট্যগুলিকে উপস্থাপন করতে হবে এবং সেকেন্ডারিগুলি বাতিল করতে হবে৷ উদাহরণস্বরূপ, যদি আমরা একটি SchoolTeacherক্লাস ডিজাইন করছি, তাহলে উচ্চতা সম্ভবত একজন শিক্ষকের প্রয়োজনীয় সম্পত্তি হবে না। প্রকৃতপক্ষে, এই বৈশিষ্ট্যটি একজন শিক্ষকের জন্য গুরুত্বপূর্ণ নয়। কিন্তু যদি আমরা একটি BasketballPlayerক্লাস তৈরি করি, তাহলে উচ্চতা হবে সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলির মধ্যে একটি। ওয়েল, একটি বিমূর্ত ক্লাসভবিষ্যতের ক্লাসের একটি গ্রুপের জন্য সবচেয়ে বিমূর্ত, "রুক্ষ ওয়ার্কপিস"। ওয়ার্কপিসটি সরাসরি ব্যবহার করা যাবে না - এটি খুব "রুক্ষ"। তবে এটি নির্দিষ্ট বৈশিষ্ট্যযুক্ত অবস্থা এবং আচরণকে সংজ্ঞায়িত করে যা ভবিষ্যতের ক্লাস - বিমূর্ত শ্রেণীর বংশধরদের - থাকবে।

জাভাতে বিমূর্ত ক্লাসের উদাহরণ

গাড়ির সাথে একটি সাধারণ উদাহরণ বিবেচনা করুন:

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;
  
   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
এই সহজ বিমূর্ত ক্লাস মত দেখায় কি. আপনি দেখতে পারেন, বিশেষ কিছুই :) কেন আমরা এই প্রয়োজন হতে পারে? প্রথমত, এটি আমাদের প্রয়োজনীয় সত্তার সবচেয়ে বিমূর্ত বিবরণ প্রদান করে - একটি গাড়ি। বিমূর্ত কীওয়ার্ড এখানে কিছু মানে . বাস্তব জগতে, "শুধু একটি গাড়ি" বলে কিছু নেই। এখানে ট্রাক, রেস কার, সেডান, কুপ এবং এসইউভি রয়েছে। আমাদের বিমূর্ত শ্রেণীটি কেবল একটি "ব্লুপ্রিন্ট" যা আমরা পরে নির্দিষ্ট গাড়ির ক্লাস তৈরি করতে ব্যবহার করব।

public class Sedan extends Car {
  
   @Override
   public void gas() {
       System.out.println("The sedan is accelerating!");
   }

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }
  
}
অনেক উপায়ে, এটি উত্তরাধিকার বিষয়ক পাঠে আমরা যে বিষয়ে কথা বলেছি তার অনুরূপ। শুধুমাত্র সেই ক্ষেত্রে আমাদের একটি Carক্লাস ছিল যার পদ্ধতিগুলি বিমূর্ত ছিল না। তবে এই জাতীয় সমাধানের বেশ কয়েকটি অসুবিধা রয়েছে যা বিমূর্ত শ্রেণিতে স্থির করা হয়েছে। প্রথম এবং সর্বাগ্রে, একটি বিমূর্ত শ্রেণীর একটি উদাহরণ তৈরি করা যাবে না:

public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
জাভার স্রষ্টা উদ্দেশ্যমূলকভাবে এই "বৈশিষ্ট্য" তৈরি করেছেন। আবার, মনে রাখবেন: একটি বিমূর্ত ক্লাস ভবিষ্যতের "নিয়মিত" ক্লাসের জন্য একটি নীলনকশা মাত্র । আপনার ব্লুপ্রিন্টের কপির দরকার নেই, তাই না? একইভাবে, একটি বিমূর্ত শ্রেণীর দৃষ্টান্ত তৈরি করার প্রয়োজন নেই :) এবং যদি ক্লাসটি Carবিমূর্ত না হয় তবে আমরা সহজেই এর উদাহরণ তৈরি করতে পারতাম:

public class Car {

   private String model;
   private String color;
   private int maxSpeed;
  
   public void go() {
       // ...some logic
   }

   public  void brake() {
       // ...some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // This is okay. The car is created.
   }
}
বর্তমানে, আমাদের প্রোগ্রামে একধরনের বোধগম্য গাড়ি রয়েছে। এটি একটি ট্রাক নয়, একটি রেস কার নয় এবং একটি সেডান নয়, তবে এটি আসলে কী তা স্পষ্ট নয়৷ এটি "শুধু একটি গাড়ি" যা বাস্তবে বিদ্যমান নেই। প্রাণীদের ক্ষেত্রেও একই উদাহরণ দেওয়া যেতে পারে। Animalআপনার প্রোগ্রামে বস্তু (" শুধু প্রাণী ") থাকলে কল্পনা করুন । এটি কী ধরনের, এটি কোন পরিবারের, বা এর বৈশিষ্ট্যগুলি কী তা স্পষ্ট নয়। এটি একটি প্রোগ্রাম এক দেখতে অদ্ভুত হবে. প্রকৃতিতে কোন "শুধু প্রাণী" নেই। শুধুমাত্র কুকুর, বিড়াল, শিয়াল, মোল ইত্যাদি। বিমূর্ত ক্লাস আমাদেরকে " শুধু বস্তু " থেকে বাঁচায় । তারা আমাদের বেসলাইন রাষ্ট্র এবং আচরণ দেয়. উদাহরণস্বরূপ, সমস্ত গাড়ির একটি মডেল , রঙ এবং সর্বোচ্চ গতি থাকতে হবে, এবং তারা অবশ্যই গ্যাস এবং ব্রেক প্রয়োগ করতে সক্ষম হবে । এটাই. এটি একটি সাধারণ বিমূর্ত ব্লুপ্রিন্ট যা আপনি পরে আপনার প্রয়োজনীয় ক্লাস ডিজাইন করতে ব্যবহার করবেন। দ্রষ্টব্য: বিমূর্ত শ্রেণীর দুটি পদ্ধতিও বিমূর্ত , যার মানে তাদের কোনো বাস্তবায়ন নেই। কারণটি একই: বিমূর্ত ক্লাসগুলি "শুধু গাড়ি" এর জন্য "ডিফল্ট আচরণ" তৈরি করে না। তারা শুধু নির্দেশ করে যে প্রতিটি গাড়ির কি করতে হবে। এটি বলেছে, যদি আপনার ডিফল্ট আচরণের প্রয়োজন হয় তবে আপনি একটি বিমূর্ত শ্রেণিতে পদ্ধতিগুলি প্রয়োগ করতে পারেন। জাভা এটি নিষিদ্ধ করে না:

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Accelerating!");
   }

   public abstract void brake();
  
   // Getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
কনসোল আউটপুট:
Accelerating!
আপনি দেখতে পাচ্ছেন, আমরা বিমূর্ত শ্রেণিতে একটি পদ্ধতি প্রয়োগ করেছি, তবে অন্যটি নয়। ফলস্বরূপ, আমাদের Sedanক্লাসের আচরণ দুটি ভাগে বিভক্ত: যদি আমরা এটির gas()পদ্ধতি বলি, আচরণটি বিমূর্ত Carঅভিভাবক শ্রেণী থেকে "টানা আপ" হয় এবং আমরা brake()ক্লাসে পদ্ধতিটি বাস্তবায়ন করি Sedan। যে সুপার সুবিধাজনক এবং নমনীয়. কিন্তু আমাদের ক্লাস এখন এত বিমূর্ত নয়, তাই না ? সর্বোপরি, এটি আসলে অর্ধেক পদ্ধতি প্রয়োগ করেছে। আসল বিষয়টি হল - এবং এটি একটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য - একটি ক্লাস বিমূর্ত হয় যদি এমনকি এর একটি পদ্ধতিও বিমূর্ত হয়. দুইটির একটি পদ্ধতি, বা হাজারের মধ্যে একটি - এটা কোন ব্যাপার না। আমরা এমনকি সমস্ত পদ্ধতি প্রয়োগ করতে পারি, কোনো বিমূর্ত রেখে না। ফলাফল কোন বিমূর্ত পদ্ধতি ছাড়া একটি বিমূর্ত ক্লাস হবে. এটি নীতিগতভাবে সম্ভব — কম্পাইলার কোনও ত্রুটি তৈরি করবে না — তবে এটি না করাই ভাল, কারণ এটি বিমূর্ত শব্দটিকে তার অর্থ থেকে বঞ্চিত করে। আপনার সহকর্মী প্রোগ্রামাররাও এটি দেখে খুব অবাক হবেন :/ এটি বলেছে, যদি একটি পদ্ধতিকে বিমূর্ত হিসাবে চিহ্নিত করা হয়, তবে প্রতিটি বংশধর শ্রেণীকে অবশ্যই এটি প্রয়োগ করতে হবে বা বিমূর্ত হিসাবে ঘোষণা করতে হবে। অন্যথায়, কম্পাইলার একটি ত্রুটি নিক্ষেপ করবে. অবশ্যই, প্রতিটি শ্রেণী শুধুমাত্র একটি বিমূর্ত শ্রেণীর উত্তরাধিকারী হতে পারে, তাই উত্তরাধিকারের ক্ষেত্রে বিমূর্ত এবং নিয়মিত ক্লাসের মধ্যে কোন পার্থক্য নেই। আমরা একটি বিমূর্ত শ্রেণী বা নিয়মিত একটি উত্তরাধিকারী কিনা তা কোন ব্যাপার না - শুধুমাত্র একটি অভিভাবক শ্রেণী থাকতে পারে।

কেন জাভা একাধিক শ্রেণীর উত্তরাধিকার নেই

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

public class Toaster {
  
  
 public void on() {

       System.out.println("The toaster is on. We're toasting!");
   }
  
   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Boom!");
   }
}
আপনি দেখতে পারেন, উভয় শ্রেণীর একটি on()পদ্ধতি আছে। টোস্টারের জন্য, পদ্ধতিটি টোস্ট তৈরি করা শুরু করে, তবে পারমাণবিক বোমার ক্ষেত্রে এটি একটি বিস্ফোরণ ঘটায়। উহ-ওহ :/ এখন কল্পনা করুন যে আপনি এর মধ্যে কিছু তৈরি করার সিদ্ধান্ত নিয়েছেন (কেন আমাকে জিজ্ঞাসা করবেন না!)। এখানে আপনার ক্লাস: MysteriousDevice! এই কোডটি অবশ্যই কাজ করবে না। আমরা এটিকে "কী হতে পারে" এর উদাহরণ হিসাবে উপস্থাপন করি:

public class MysteriousDevice extends Toster, NuclearBomb {

   public static void main(String[] args) {
      
       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // And what should happen here? Will we get toast or a nuclear apocalypse?
   }
}
দেখা যাক আমরা কি পেয়েছি। রহস্যময় ডিভাইসটি একই সময়ে টোস্টার এবং নিউক্লিয়ার বোম্ব উভয় থেকে উদ্ভূত হয়েছে। উভয়ের একটি on()পদ্ধতি আছে। ফলস্বরূপ, আমরা on()কোন MysteriousDeviceবস্তুর উপর কল করলে কোন বাস্তবায়ন কার্যকর করা উচিত তা স্পষ্ট নয়। বস্তুটি বুঝতে পারবে না। এবং এটি সব বন্ধ করার জন্য, নিউক্লিয়ার বোম্বের একটি পদ্ধতি নেই off(), তাই আমরা যদি সঠিকভাবে অনুমান না করি, তাহলে ডিভাইসটি বন্ধ করা অসম্ভব হবে। জাভাতে বিমূর্ত ক্লাসের কংক্রিট উদাহরণ - 2এই "ভুল বোঝাবুঝি", যখন এটি স্পষ্ট নয় যে কোন আচরণটি কার্যকর করা উচিত, ঠিক সেই কারণেই জাভা নির্মাতারা একাধিক উত্তরাধিকার প্রত্যাখ্যান করেছিলেন। এটি বলেছে, আপনি শিখবেন যে জাভা ক্লাস অনেক ইন্টারফেস বাস্তবায়ন করতে পারে।