"হ্যালো, অ্যামিগো! আমাদের কাছে একটি আকর্ষণীয় নতুন বিষয় আছে।"

"আজকে শুধুমাত্র আকর্ষণীয় বিষয়ের দিন!"

"ধন্যবাদ কেন!"

"আপনাকে স্বাগতম."

"মনে আছে যখন আমরা চেস আইটেম বেস ক্লাস প্রবর্তন করেছিলাম দাবার টুকরোগুলির জন্য সমস্ত ক্লাস সহজ করার জন্য?"

"হ্যাঁ."

"এখন কল্পনা করুন যে প্রতিটি টুকরোটির একটি পদ্ধতি রয়েছে যা পর্দায় অংশটিকে রেন্ডারিং পরিচালনা করে। আপনি পদ্ধতিটিকে কল করেন এবং অংশটি তার বর্তমান স্থানাঙ্কে নিজেকে আঁকতে পারে। এই পদ্ধতিটিকে বেস ক্লাসে স্থানান্তর করা কি সহায়ক হবে?"

"হ্যাঁ." আমি পলিমরফিজম সম্পর্কে জানার পরে, আমি তাদের প্রকার নির্বিশেষে সমস্ত টুকরোগুলির জন্য রেন্ডার পদ্ধতি কল করতে সক্ষম হব। এটার মতো কিছু:"

উদাহরণ স্বরূপ:
class ChessBoard
{
  public void drawAllChessItems()
  {
  //draw them regardless of their type.
  ArrayList <ChessItem> items = new ArrayList<ChessItem>();
  items.add(new King());
  items.add(new Queen());
  items.add(new Bishop());

  //draw them regardless of their type.
  for (ChessItem item: items)
  {
   item.draw();
  }
 }
}

"ভাল হয়েছে। ঠিকই। আর চেসআইটেম ক্লাসের ড্র পদ্ধতি দিয়ে কি করা হবে?"

"আমি জানি না। দাবাতে এমন একটি অংশ নেই। এবং এর মানে এটির কোন ভিজ্যুয়াল উপস্থাপনা নেই।"

"সুনির্দিষ্টভাবে। এবং এটি একটি ChessItem অবজেক্ট তৈরি করার কোন মানে হয় না। এই ধরনের কোন দাবার অংশ নেই। এটি শুধুমাত্র একটি বিমূর্ততা - একটি ক্লাস যা আমরা সুবিধার জন্য তৈরি করেছি। OOP-তে বিমূর্ততা কীভাবে কাজ করে: আমরা সমস্ত গুরুত্বপূর্ণ (শেয়ার করা) স্থানান্তরিত করেছি সমস্ত টুকরো দ্বারা) ডেটা এবং পদ্ধতিগুলিকে একটি বেস ক্লাসে পরিণত করি , কিন্তু আমরা নির্দিষ্ট দাবা টুকরাগুলির সাথে সম্পর্কিত ক্লাসগুলিতে তাদের পার্থক্য রেখেছিলাম।"

জাভা এর জন্য একটি বিশেষ ক্লাস টাইপ আছে: বিমূর্ত ক্লাস । বিমূর্ত ক্লাস সম্পর্কে এখানে তিনটি জিনিস মনে রাখতে হবে।

1) একটি বিমূর্ত শ্রেণী তাদের বাস্তবায়ন না করে পদ্ধতি ঘোষণা করতে পারে। এই ধরনের পদ্ধতিকে বিমূর্ত পদ্ধতি বলা হয়।

উদাহরণ স্বরূপ:
public abstract class ChessItem
{
 public int x, y; //coordinates
 private int value; //the piece's "value"

 public int getValue() //an ordinary method, returns value
 {
   return value;
 }

 public abstract void draw(); //abstract method. There is no implementation.

}

2) একটি বিমূর্ত পদ্ধতি কীওয়ার্ড বিমূর্ত দিয়ে চিহ্নিত করা হয় ।

যদি একটি ক্লাসের এমনকি একটি বিমূর্ত পদ্ধতি থাকে, তাহলে ক্লাসটিও বিমূর্ত দিয়ে চিহ্নিত করা হয় ।

3) আপনি একটি বিমূর্ত শ্রেণীর বস্তু তৈরি করতে পারবেন না। কোড করার চেষ্টা করা সহজভাবে কম্পাইল করা হবে না।

জাভা কোড বর্ণনা
ChessItem item = new ChessItem();
item.draw();
এই কোড কম্পাইল করা হবে না.
ChessItem item = new Queen();
item.draw();
কিন্তু আপনি এটা করতে পারেন.

4) যদি আপনার ক্লাসটি একটি বিমূর্ত ক্লাসের উত্তরাধিকারী হয়, তাহলে আপনাকে উত্তরাধিকারসূত্রে পাওয়া সমস্ত বিমূর্ত পদ্ধতিকে ওভাররাইড করতে হবে, অর্থাৎ আপনাকে সেগুলি বাস্তবায়ন করতে হবে। অন্যথায়, আপনার ক্লাসকেও বিমূর্ত ঘোষণা করতে হবে। যদি ক্লাসের এমনকি একটি অবাস্তব পদ্ধতি সরাসরি ক্লাসে ঘোষণা করা থাকে বা পিতামাতার শ্রেণী থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয়, তাহলে ক্লাসটিকে বিমূর্ত হিসাবে বিবেচনা করা হয়।

"কিন্তু কেন এই সব প্রয়োজনীয়? কেন আমাদের বিমূর্ত ক্লাসের প্রয়োজন? পরিবর্তে সাধারণ ক্লাস ব্যবহার করা কি সম্ভব নয়? এবং বিমূর্ত পদ্ধতির পরিবর্তে, আমরা কি কোঁকড়া বন্ধনী খোলা এবং বন্ধ করার সমন্বয়ে খালি বাস্তবায়ন তৈরি করতে পারি না?"

"আপনি করতে পারেন। কিন্তু এই বিধিনিষেধগুলি সংশোধকের মতো private। আমরা privateইচ্ছাকৃতভাবে ডেটাতে সরাসরি অ্যাক্সেস ব্লক করতে মডিফায়ার ব্যবহার করি, যাতে অন্যান্য প্রোগ্রামার এবং তাদের ক্লাস আমাদের publicপদ্ধতিগুলি ব্যবহার করে।"

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

"আমি এখনও বুঝতে পারছি না কেন আমরা আমাদের জীবনকে এভাবে জটিল করতে চাই।"

"এই বৈশিষ্ট্যের সুবিধাটি বড় প্রকল্পগুলিতে স্পষ্ট। আপনার যত বেশি ক্লাস আছে, তত স্পষ্টভাবে আপনাকে তাদের ভূমিকা বর্ণনা করতে হবে। আপনি এটি করার সুবিধা দেখতে পাবেন, এবং শীঘ্রই। প্রত্যেককে এর মধ্য দিয়ে যেতে হবে।"