"হ্যালো, অ্যামিগো! এখন এখানে একটি বিষয় যা আমি মনে করি আপনি অনেক ব্যবহার করবেন। আমি উত্তরাধিকার সম্পর্কে কথা বলছি। "

অদীক্ষিতদের জন্য, প্রোগ্রামিং জাদুর মত। তো একটা উপমা দিয়ে শুরু করি...

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

উত্তরাধিকার।  উত্তরাধিকারের সুবিধা- ১

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

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

1) আপনি যে ক্লাসটি খুঁজে পান তা ইতিমধ্যেই বাইটকোডে সংকলিত হতে পারে। আপনি এর সোর্স কোড অ্যাক্সেস নাও থাকতে পারে.

2) আপনার কাছে ক্লাসের সোর্স কোড থাকতে পারে, তবে এমন একটি কোম্পানিতেও কাজ করুন যেখানে আপনি যদি অন্য কারও কোডের 6 লাইনও ব্যবহার করেন তবে কয়েক বিলিয়নের জন্য মামলা হতে পারে। এবং তারপর তারা আপনার বিরুদ্ধে মামলা করবে।

3) এটি প্রচুর কোডের অপ্রয়োজনীয় নকলের দিকে পরিচালিত করে। এবং যদি অন্য শ্রেণীর লেখক একটি বাগ খুঁজে পান এবং এটি ঠিক করেন তবে আপনার কাছে এখনও বাগটি রয়েছে।

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

উত্তরাধিকার।  উত্তরাধিকারের সুবিধা - 2

"খুব মজার। অনুগ্রহ করে এগিয়ে যান।"

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

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

"ধরুন আমরা একটি দাবা প্রোগ্রাম লিখছি। দাবা খেলার জন্য আমাদের ক্লাস লাগবে। আপনি কোন ক্লাসের পরামর্শ দেবেন, অ্যামিগো?"

"রাজা, রানী, বিশপ, নাইট, রুক এবং প্যান।"

"খুব ভালো। আপনি একটা জিনিস মিস করেননি।"

"এবং আপনি এই ক্লাসগুলিতে কোন ডেটা সংরক্ষণ করার পরামর্শ দেবেন?"

"প্রতিটি টুকরার বোর্ডের অবস্থান (x এবং y) এবং মূল্য। সর্বোপরি, কিছু টুকরা অন্যদের চেয়ে বেশি মূল্যবান।"

"এবং এই শ্রেণীর মধ্যে পার্থক্য কি?"

"তারা টুকরোগুলো কিভাবে সরায় তার মধ্যে পার্থক্য। তাদের আচরণে।"

"হ্যাঁ। আপনি তাদের এইরকম ক্লাস হিসাবে সংজ্ঞায়িত করতে পারেন:"

class King
{
int x;
int y;
int worth;
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen
{
int x;
int y;
int worth;
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook
{
int x;
int y;
int worth;
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class Knight
{
int x;
int y;
int worth;
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop
{
int x;
int y;
int worth;
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn
{
int x;
int y;
int worth;
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"হ্যাঁ, আমি ঠিক এভাবেই লিখব।"

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

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

"কি চমৎকার!"

"অবশ্যই! সুবিধাটি বিশেষ করে হাজার হাজার বিভিন্ন অবজেক্ট এবং শত শত ক্লাস সমন্বিত প্রকল্পগুলিতে বড়। এই ক্ষেত্রে, সঠিকভাবে নির্বাচিত ক্লাসগুলি শুধুমাত্র যুক্তিকে উল্লেখযোগ্যভাবে সরল করতে পারে না, তবে প্রয়োজনীয় কোডকে দশের একটি ফ্যাক্টর দ্বারা কমাতে পারে।"

"তাহলে একটি ক্লাস উত্তরাধিকারী হতে আপনাকে কি করতে হবে?"

"একটি শ্রেণী ঘোষণা করার পরে, আমরা ' extensions ' কীওয়ার্ডটি ব্যবহার করি , যার পরে অভিভাবক শ্রেণীর নাম। আপনি শুধুমাত্র একটি শ্রেণী থেকে উত্তরাধিকারী হতে পারেন। "

উত্তরাধিকার।  উত্তরাধিকারের সুবিধা- 3

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

"কিন্তু যদি আমি দুটি শ্রেণী থেকে উত্তরাধিকারী হতে চাই? আমি কি কিছু করতে পারি?!"

"আসলে না। জাভা ক্লাসগুলি বাস্তবায়নের একাধিক উত্তরাধিকার সমর্থন করে না: একটি ক্লাসে শুধুমাত্র একটি একক অভিভাবক শ্রেণী থাকতে পারে। কিন্তু টাইপের একাধিক উত্তরাধিকার রয়েছে, যার মানে হল একটি ক্লাস একাধিক ইন্টারফেস প্রয়োগ করতে পারে। এটি সমস্যাটিকে কিছুটা প্রশমিত করে। "

"আমি দেখছি। এবং একটি ইন্টারফেস কি?"

"আমি আপনাকে আগামীকাল ইন্টারফেস সম্পর্কে বলব। আপাতত, আসুন উত্তরাধিকারের সন্ধান চালিয়ে যাই।"