1. পেগাসাস

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

ধরা যাক আপনি একজন উইজার্ড যিনি একটি উড়ন্ত ঘোড়া তৈরি করতে চান। একদিকে, আপনি একটি পেগাসাস জাল করার চেষ্টা করতে পারেন। কিন্তু প্রকৃতিতে পেগাসির অস্তিত্ব না থাকায় এটা খুবই কঠিন হবে। নিজেকে অনেক কিছু করতে হবে। এটি একটি ঘোড়া নিতে এবং তার ডানা জাদু করা অনেক সহজ.

প্রোগ্রামিং-এ, এই প্রক্রিয়াটিকে "উত্তরাধিকার" বলা হয়। ধরুন আপনার একটি খুব জটিল ক্লাস লিখতে হবে। স্ক্র্যাচ থেকে কোড লিখতে এবং তারপরে ত্রুটিগুলি সন্ধান করার জন্য দীর্ঘ সময়ের জন্য সবকিছু পরীক্ষা করতে অনেক সময় লাগে। কেন কঠিন পথে যেতে? এই ধরনের একটি ক্লাস ইতিমধ্যে বিদ্যমান কিনা তা দেখতে আরও ভাল।

ধরুন আপনি একটি ক্লাস খুঁজে পেয়েছেন যার পদ্ধতিগুলি আপনার প্রয়োজনীয় কার্যকারিতার 80% প্রয়োগ করে। আপনি এটা দিয়ে পরবর্তী কি করবেন? আপনি শুধু আপনার ক্লাসে এর কোড কপি করতে পারেন। তবে এই সমাধানটির বেশ কয়েকটি ত্রুটি রয়েছে:

  1. আপনি যে ক্লাসটি খুঁজে পান সেটি ইতিমধ্যেই বাইটকোডে কম্পাইল করা হতে পারে এবং এর সোর্স কোডে আপনার অ্যাক্সেস নাও থাকতে পারে।
  2. ক্লাসের সোর্স কোড পাওয়া যায়, কিন্তু আপনি এমন একটি কোম্পানির জন্য কাজ করেন যার বিরুদ্ধে অন্য কারো কোডের এমনকি 6 লাইন ব্যবহার করার জন্য কয়েক বিলিয়নের জন্য মামলা করা যেতে পারে। এবং তারপর আপনার নিয়োগকর্তা আপনার বিরুদ্ধে মামলা করবে।
  3. বিপুল পরিমাণ কোডের অপ্রয়োজনীয় নকল। অতিরিক্তভাবে, যদি একটি বহিরাগত শ্রেণীর লেখক এটিতে একটি বাগ খুঁজে পান এবং এটি ঠিক করেন তবে আপনার কাছে এখনও বাগ থাকবে।

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


2. সাধারণ বেস ক্লাস

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

বিমূর্তকরণের সুবিধাগুলি যেমন শুধুমাত্র পার্শ্ব এনক্যাপসুলেশনের সাথে প্রকাশ করা হয়, তেমনি পলিমরফিজম ব্যবহার করার সময় উত্তরাধিকারের সুবিধাগুলিও অনেক বেশি উন্নত হয়। তবে আপনি একটু পরে এটি সম্পর্কে শিখবেন। আজ আমরা উত্তরাধিকার ব্যবহারের কয়েকটি উদাহরণ দেখব।

দাবা টুকরা

ধরুন আমরা একটি প্রোগ্রাম লিখছি যা একজন মানুষের ব্যবহারকারীর সাথে দাবা খেলে। তদনুসারে, টুকরা প্রতিনিধিত্ব করার জন্য আমাদের ক্লাস প্রয়োজন। তারা কি ক্লাস হবে?

আপনি যদি কখনও দাবা খেলে থাকেন, তাহলে স্পষ্ট উত্তর হল রাজা, রানী, বিশপ, নাইট, রুক এবং প্যান।

তবে ক্লাসগুলিকে এখনও প্রতিটি টুকরো সম্পর্কে তথ্য সংরক্ষণ করতে হবে। উদাহরণস্বরূপ, x এবং y স্থানাঙ্ক এবং টুকরাটির মান। সব পরে, কিছু টুকরা অন্যদের তুলনায় আরো মূল্যবান।

উপরন্তু, টুকরা ভিন্নভাবে সরানো, যার মানে ক্লাস বিভিন্ন আচরণ বাস্তবায়ন করবে। এখানে আপনি কিভাবে তাদের ক্লাস হিসাবে সংজ্ঞায়িত করতে পারেন:

class King
{
   int x;
   int y;
   int worth;

   void kingMove()
   {
     // Code that decides
     // how to move
     // the king
   }
}
class Queen
{
   int x;
   int y;
   int worth;

   void queenMove()
   {
     // Code that decides
     // how to move
     // the queen
   }
}
class Rook
{
   int x;
   int y;
   int worth;

   void rookMove()
   {
     // Code that decides
     // how to move
     // the rook
   }
}
class Knight
{
   int x;
   int y;
   int worth;

   void knightMove()
   {
     // Code that decides
     // how to move
     // the knight
   }
}
class Bishop
{
   int x;
   int y;
   int worth;

   void bishopMove()
   {
     // Code that decides
     // how to move
     // the bishop
   }
}
class Pawn
{
   int x;
   int y;
   int worth;

   void pawnMove()
   {
     // Code that decides
     // how to move
     // the pawn
   }
}

এটি দাবা খেলার একটি খুব আদিম বর্ণনা।

সাধারণ বেস ক্লাস

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

class King extends ChessItem
{
   void kingMove()
   {
     // Code that decides
     // how to move the king
   }
}
class Queen extends ChessItem
{
   void queenMove()
   {
     // Code that decides
     // how to move the queen
   }
}
class Rook extends ChessItem
{
   void rookMove()
   {
     // Code that decides
     // how to move the rook
   }
}
class ChessItem
{
   int x;
   int y;
   int worth;
}
class Knight extends ChessItem
{
   void knightMove()
   {
     // Code that decides
     // how to move the knight
   }
}
class Bishop extends ChessItem
{
   void bishopMove()
   {
     // Code that decides
     // how to move the bishop
   }
}
class Pawn extends ChessItem
{
   void pawnMove()
   {
     // Code that decides
     // how to move the pawn
   }
}

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


3. শ্রেণী উত্তরাধিকার -extends

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

class Descendant extends Parent

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

ছবিতে, আমরা দেখতে পাই যে একটি গরু উত্তরাধিকারসূত্রে একটি শূকর পেয়েছে, যা একটি মুরগির উত্তরাধিকারসূত্রে পেয়েছে, যা উত্তরাধিকারসূত্রে একটি ডিম পেয়েছে। শুধু একজন অভিভাবক! এই ধরনের উত্তরাধিকার সবসময় যৌক্তিক নয়। কিন্তু যখন আপনার কাছে শুধু একটি শূকর থাকে এবং আপনার সত্যিই একটি গরুর প্রয়োজন হয়, তখন প্রোগ্রামাররা প্রায়শই একটি শূকর থেকে একটি গরু তৈরি করার তাগিদকে প্রতিহত করতে পারে না।

জাভা একাধিক উত্তরাধিকার নেই: একটি শ্রেণী দুটি শ্রেণীর উত্তরাধিকারী হতে পারে না। প্রতিটি ক্লাসে শুধুমাত্র একটি অভিভাবক শ্রেণী থাকতে পারে। যদি কোন অভিভাবক শ্রেণী নির্দিষ্ট করা না থাকে, তাহলে অভিভাবক শ্রেণী হল Object

যে বলে, জাভা ইন্টারফেসের একাধিক উত্তরাধিকার আছে। এটি সমস্যাটি কিছুটা প্রশমিত করে। আমরা একটু পরে ইন্টারফেস সম্পর্কে কথা বলব, কিন্তু আপাতত উত্তরাধিকার অন্বেষণ চালিয়ে যাওয়া যাক।