CodeGym /Java Blog /এলোমেলো /জাভাতে বিমূর্ত ক্লাসের নির্দিষ্ট উদাহরণ
John Squirrels
লেভেল 41
San Francisco

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

এলোমেলো দলে প্রকাশিত
ওহে! অতীতের পাঠে, আমরা ইন্টারফেসের সাথে দেখা করেছি এবং সেগুলি কীসের জন্য তা খুঁজে বের করেছি। আজকের টপিকটি আগেরটির প্রতিধ্বনি করবে। জাভাতে বিমূর্ত ক্লাস সম্পর্কে কথা বলা যাক ।জাভাতে বিমূর্ত ক্লাসের নির্দিষ্ট উদাহরণ - 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!");
   }

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

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 gas() {
       // Some logic
   }

    public void brake() {
       // Some logic
   }
}


public class Main {

   public static void main(String[] args) {

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

public abstract class Car {

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

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

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

কেন জাভা ক্লাসের একাধিক উত্তরাধিকার নেই

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

public class Toaster {


 public void on() {

       System.out.println("The toaster is on. Toast is being prepared!");
   }

   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 Toaster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // So what should happen here? Do we get toast or a nuclear apocalypse?
   }
}
আসুন আমরা কি আছে তা একবার দেখে নেওয়া যাক। রহস্যময় ডিভাইসটি একই সাথে টোস্টার এবং নিউক্লিয়ার বোম্বের উত্তরাধিকারী। উভয়েরই on()পদ্ধতি আছে। ফলস্বরূপ, যদি আমরা on()পদ্ধতিটিকে কল করি, তবে বস্তুটিতে কোনটি আহ্বান করা উচিত তা স্পষ্ট নয় MysteriousDevice। বস্তুটি কখনই জানতে পারে এমন কোন উপায় নেই। এবং এটি সব বন্ধ করার জন্য: নিউক্লিয়ার বোম্বের কোনও পদ্ধতি নেই off(), তাই আমরা যদি সঠিক অনুমান না করি তবে ডিভাইসটি নিষ্ক্রিয় করা অসম্ভব হবে। জাভাতে বিমূর্ত ক্লাসের নির্দিষ্ট উদাহরণ - 2ঠিক এই 'বিভ্রান্তির' কারণেই, যেখানে বস্তুটি জানে না যে কী আচরণ প্রদর্শন করতে হবে, জাভার নির্মাতারা একাধিক উত্তরাধিকার পরিত্যাগ করেছেন। যাইহোক, আপনি মনে রাখবেন যে জাভা ক্লাস একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে। যাইহোক, আপনার পড়াশোনায়, আপনি ইতিমধ্যে অন্তত একটি বিমূর্ত ক্লাসের সম্মুখীন হয়েছেন!

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
এটা আপনার পুরানো বন্ধু, Calendarক্লাস. এটি বিমূর্ত এবং বেশ কয়েকটি সন্তান রয়েছে। তাদের মধ্যে একজন হল GregorianCalendar. আপনি ইতিমধ্যে তারিখ সম্পর্কে পাঠে এটি ব্যবহার করেছেন। :) সবকিছু যথেষ্ট পরিষ্কার বলে মনে হচ্ছে. শুধু একটি প্রশ্ন আছে: যাইহোক বিমূর্ত ক্লাস এবং ইন্টারফেসের মধ্যে মৌলিক পার্থক্য কি? কেন তারা শুধুমাত্র একটি ভাষা সীমাবদ্ধ করার পরিবর্তে জাভাতে উভয়ই যোগ করেছে? সব পরে, যে সম্পূর্ণরূপে পর্যাপ্ত হবে. আমরা পরবর্তী পাঠে এই বিষয়ে কথা বলব ! তখন পর্যন্ত :)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION