1. সাধারণ বেস ক্লাস
আজ আমরা আকর্ষণীয় বিষয়ের একটি স্মারগাসবোর্ড উপভোগ করব। মনে আছে যখন আমরা ChessItem
দাবা টুকরা প্রতিনিধিত্বকারী ক্লাস সব সহজ করার জন্য বেস ক্লাস চালু করেছিলাম? আমি তাই আশা করি 🙂
এখন কল্পনা করুন যে প্রতিটি অংশের একটি draw()
পদ্ধতি রয়েছে যা পর্দায় অঙ্কন পরিচালনা করে। আপনি পদ্ধতি কল draw()
, এবং টুকরা তার বর্তমান স্থানাঙ্কে নিজেকে আঁকা. এই পদ্ধতিটি বেস ক্লাসে সরানো সুবিধাজনক হবে।
যদি draw()
পদ্ধতিটি ChessItem বেস ক্লাসে থাকে, তাহলে আমরা এটিকে টুকরো ক্লাসে ওভাররাইড করতে পারি এবং এর মতো মার্জিত কোড লিখতে পারি:
class ChessBoard
{
public void drawAllChessItems()
{
// Add the pieces to the list
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
, আমরা কোডটিকে ব্যাপকভাবে সরল করতে সক্ষম হয়েছি: প্রতিটি ক্লাসের পদ্ধতিগুলিকে আলাদাভাবে কল করার প্রয়োজন নেই, আমরা সহজেই সমস্ত বস্তুকে একক সংগ্রহে সংরক্ষণ করতে পারি ইত্যাদি।
কিন্তু এখানে একটি আকর্ষণীয় প্রশ্ন: ক্লাস ড্রয়ের পর্দায় draw()
সরাসরি ঘোষিত পদ্ধতিটি কী হওয়া উচিত? ChessItem
সর্বোপরি, দাবাতে এমন কোনও টুকরো নেই, তাই আঁকার কিছু নেই।
এটা একদম ঠিক। আরও কি, ChessItem
সরাসরি বস্তু তৈরি করার কোন মানে হয় না। এটি একটি দাবা অংশ নয়, বরং শুধুমাত্র একটি বিমূর্ততা - একটি ক্লাস যা আমরা আমাদের সুবিধার জন্য তৈরি করেছি। এইভাবে OOP- তে বিমূর্ততা কাজ করে : আমরা গুরুত্বপূর্ণ ডেটা এবং পদ্ধতিগুলিকে (সব অংশ দ্বারা ভাগ করা) একটি বেস ক্লাসে স্থানান্তরিত করি এবং তাদের পার্থক্যগুলিকে পৃথক বংশধর শ্রেণিতে রাখি।
2. বিমূর্ত ক্লাস

এই ধরনের পরিস্থিতিতে, জাভা একটি বিশেষ ধরনের ক্লাস আছে: বিমূর্ত ক্লাস । এগুলি প্রোগ্রামারদের জন্য অনুরূপ ক্লাসের সাথে কাজ করা সহজ করতে এবং তাদের মধ্যে সদৃশ কোডের পরিমাণ কমানোর জন্য ডিজাইন করা হয়েছে।
এখানে বিমূর্ত ক্লাস সম্পর্কে জানার জন্য তিনটি জিনিস রয়েছে।
কোন বাস্তবায়ন ছাড়া পদ্ধতি
একটি বিমূর্ত শ্রেণীর একটি বাস্তবায়ন ছাড়া একটি পদ্ধতি ঘোষণা থাকতে পারে। এই পদ্ধতি বিমূর্ত করে তোলে ঠিক কি. মেথড বডিটি সহজভাবে একটি সেমিকোলন দিয়ে প্রতিস্থাপিত হয়। আর মেথডের নামের আগে আমরা কীওয়ার্ড লিখি abstract
। উদাহরণ:
public abstract class ChessItem
{
public int x, y; // Coordinates
private int value; // The piece's value
public int getValue() // Ordinary method that returns value field
{
return value;
}
public abstract void draw(); // Abstract method. The implementation is missing.
}
বিমূর্ত ক্লাস
একটি বাস্তবায়ন ছাড়া প্রতিটি পদ্ধতি বিমূর্ত কীওয়ার্ড দিয়ে চিহ্নিত করা হয়। যদি একটি ক্লাসের এমনকি একটি বিমূর্ত পদ্ধতিও থাকে, তবে ক্লাসটি abstract
কীওয়ার্ড দিয়ে চিহ্নিত করা হয়।
বস্তু সৃষ্টি নিষিদ্ধ
আপনি একটি বিমূর্ত শ্রেণীর বস্তু তৈরি করতে পারবেন না । এই ধরনের কোড সহজভাবে কম্পাইল করা হবে না.
কোড | বর্ণনা |
---|---|
|
এই কোড কম্পাইল না : |
|
কিন্তু আপনি এটা করতে পারেন |
একটি বিমূর্ত শ্রেণী উত্তরাধিকারসূত্রে পাওয়া
যদি আপনার ক্লাসটি একটি বিমূর্ত ক্লাসের উত্তরাধিকারী হয়, তাহলে আপনাকে সমস্ত উত্তরাধিকারসূত্রে পাওয়া বিমূর্ত পদ্ধতিগুলিকে ওভাররাইড করতে হবে, অর্থাৎ আপনাকে তাদের জন্য একটি বাস্তবায়ন লিখতে হবে। অন্যথায়, আপনার ক্লাস নিজেই বিমূর্ত ঘোষণা করতে হবে.
যদি একটি ক্লাসে এমনকি একটি অবাস্তব পদ্ধতি সরাসরি ঘোষিত থাকে বা একটি অভিভাবক শ্রেণীর থেকে উত্তরাধিকারসূত্রে পাওয়া যায়, তাহলে ক্লাসটিকে বিমূর্ত হিসাবে বিবেচনা করা হয়।
এবং কেন এই সব প্রয়োজন? কেন বিমূর্ত ক্লাস প্রয়োজন? এর পরিবর্তে সাধারণ ব্যবহার করা কি সম্ভব নয়? এবং বিমূর্ত পদ্ধতির পরিবর্তে, আমরা কি মেথড বডি হিসাবে দুটি খালি কোঁকড়া বন্ধনী লিখতে পারি না?
আমরা পারতাম। কিন্তু এই বিধিনিষেধগুলি সংশোধনকারীর অনুরূপ private
। আমরা ইচ্ছাকৃতভাবে অন্যান্য প্রোগ্রামারদের সরাসরি ডেটা অ্যাক্সেস করা থেকে বিরত রাখতে এবং তাদের ক্লাস লেখার সময় শুধুমাত্র আমাদের পাবলিক পদ্ধতি ব্যবহার করতে বাধ্য করতে ব্যক্তিগত কীওয়ার্ড ব্যবহার করি।
এটি বিমূর্ত ক্লাসের সাথে একই। একটি বিমূর্ত শ্রেণীর লেখক চান না যে শ্রেণীর বস্তু তৈরি করা হোক। পরিবর্তে, লেখক আশা করেন বিমূর্ত পদ্ধতিগুলি বিমূর্ত শ্রেণী থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে এবং তারপর ওভাররাইড করা হবে।
এই পদ্ধতির সুবিধা বড় প্রকল্পগুলিতে সহজেই স্পষ্ট। আপনার যত বেশি ক্লাস আছে, তত স্পষ্টভাবে আপনাকে তাদের ভূমিকা বর্ণনা করতে হবে। আপনি অদূর ভবিষ্যতে এই পদ্ধতির সুবিধা দেখতে পাবেন। প্রতিটি জিনিস এই মাধ্যমে যায়.
GO TO FULL VERSION