আজকে , আমরা ক্লাস নিয়ে বেসিক কিছু ধারণা নেবার চেষ্টা করবো ,চলো ।
ক্লাস সাধারণত , Data ও Behaviour নিয়ে গঠিত । । এখন আমরা শিখবো , কিভাবে একটা ক্লাসে , কন্সট্রাক্টর , ডিস্ট্রাকটর ক্রিয়েট করতে হয় ???? চলো আমরা একটা সিম্পল কোড দেখে আসি ,
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
Console.ReadKey();
}
}
class Program
{
public static void Main()
{
Customer j = new Customer();
j.Print();
}
}
আমরা , এখানে Customer নামক একটা ক্লাসের ভেতরে , একটা ইন্সট্যান্স মেথড ক্রিয়েট করেছি । ।
তারপর , মেইন মেথড এর ভেতরে এই Customer ক্লাসের একটা ইন্সট্যান্স ক্রিয়েট করেছি , তারপর Print মেথডকে কল করেছি ।। এখন ঘটনা হলো , এখানে আমাদের Customer ক্লাসের ভেতরে Default ভাবে একটা কন্সট্রাক্টর ক্রিয়েট হয়ে গেছে , তাই কম্পাইল হতে কোনো প্রবলেম হলো না । । কন্সট্রাক্ট্র আর ক্লাস নেইম কিন্তু সেইম হতে হয় , এটা মাথায় রাখতে হবে । চলো , এবার আমরা নিজেরা একটা কন্সট্রাকটর ক্রিয়েট করে ফেলি ---
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
// Constructor
public Customer(string FIRSTNAME, string LASTNAME)
{
this._firstname = FIRSTNAME;
this._lastname = LASTNAME;
}
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
Console.ReadKey();
}
// DeConstructor
~Customer()
{
}
}
class Program
{
public static void Main()
{
Customer j = new Customer("Naim","Shahriar");
j.Print();
}
}
আমাদের অবশ্য , DeConstructor ক্রিয়েট করার দরকারই ছিলো না । শি শার্প এর ক্ষেত্রে , এটা গারবেজ কালেক্টর দ্বারা অটোমেটিক্যালই কলড হয় , ক্রিয়েট না করলেও ।। এটা , মূলত বিভিন্ন কন্সট্রাক্টর ও অব্জেক্ট এর কাজ গুলো হবার পর , মেমোরি থেকে এর রিসোর্স গুলো ক্লিন করতে ইউজ করা হয় , তাতে মেমোরি'র সাশ্রয় ঘটে , অন্যথায় এসব মেমোরিকে স্লো করে দেয় ।। এর কোনো রিটার্ন টাইপ থাকে না । সাথে , কোনো প্যারামিটারও থাকে না ।।
যাই হোক , এবার আসি কন্সট্রাকটর এর কথায় -- কন্সট্রাকটর এর নাম ক্লাস এর নামেই হয় , এর ভেতরে প্যারামিটার পাস করা যায় , যেমন - এখানে , আমরা দুইটি স্ট্রিং কে প্যারামিটার হিসেবে পাস করিয়েছি । এর কোনো , রিটার্ন টাইপ থাকে না ।। মেথড ও কন্সট্রাকটর এর সিনট্যাক্স গুলোর মধ্যে এটা খুব বড়ো একটা তফাত । ।
আমাদের এখানে , মূলত দুইটা ক্লাস ফিল্ড _firstname ও _lastname ।
এখানে কন্সট্রাকটর 'টি মূলত দুইটা ক্লাস ফিল্ড কে ইনিশিয়ালাইজ করার জন্য ব্যবহার করেছি । । এবার , আমরা this. ইউজ করে এক এক করে অব্জেক্ট ক্রিয়েট করবো , দুইটা ক্লাস ফিল্ড এর জন্য দুইটা অবজেক্ট ।। এই জন্য , আমরা মেইন মেথোড-এ Customer এর একটা ইন্সট্যান্স/অব্জেক্ট ক্রিয়েট করলেই, এর কন্সট্রাক্টর অটোমেটিক কল হবে । । তাহলে , এই ক্লাস Field কিন্তু ক্লাস এর ডেটা , আর আমরা যে Print মেথড ক্রিয়েট করলাম এটা ক্লাস এর Behaviour । ।
এখন আমরা , যখন মেইন মেথোড -এ Customer j = new Customer("Naim","Shahriar") ; Customer ক্লাসের অব্জেক্ট/ ইন্সট্যান্স ক্রিয়েট এর মাধ্যমে , Customer ক্লাসের কন্সট্রাক্টরকে কল করবো । । তখন , আমরা দুইটি প্যারামিটার পাস করেছি একটা "Naim" ও আরেকটা "Shahriar" ।। এর ফলে , Customer ক্লাস এর কন্সট্রাক্টর সেই প্যারামিটারকে নিয়ে _firstname ও _lastname এর অবজেক্ট এর মাধ্যমে _firstname ও ._lastname তে অ্যাসাইন করে দেয় । যে কারণে , যদিও আমরা আগেই string _firstname="Joy" ও string _lastname="Mollick" অ্যাসাইন করেছি , তারপরো । নতুন করে অ্যাসাইন করার কারণে - আমাকে শেষের'টা দেখাবে ।।
আমরা যদি , মেইনমেথোড এ কোনো , ইন্সট্যান্স ক্রিয়েট করে প্যারামিটার রাখতে না চাই , তাহলে
নিচের মতো Customer ক্লাসেই একটা প্যারামিটারলেস কন্সট্রাক্টর ক্রিয়েট করে নেবো , নিম্ন্রুপভাবে , তাহলে আর আমাদের কোনো সমস্যা হবে না ।।
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
public Customer()
:this("Naim","Shahriar")
{
}
public Customer(string FIRSTNAME, string LASTNAME)
{
this._firstname = FIRSTNAME;
this._lastname = LASTNAME;
}
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
Console.ReadKey();
}
~Customer()
{
}
}
class Program
{
public static void Main()
{
Customer j = new Customer();
j.Print();
}
}
চলো , আমরা একটা কোড দেখে আসি -----------------------------------------
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
public Customer()
:this("Naim","Shahriar")
{
}
public Customer(string FIRSTNAME, string LASTNAME)
{
this._firstname = FIRSTNAME;
this._lastname = LASTNAME;
}
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
}
~Customer()
{
}
}
class Program
{
public static void Main()
{
Customer j = new Customer();
j.Print();
Customer h = new Customer("Bill","Gates");
h.Print();
Console.ReadKey();
}
}
এখানে , আমরা একটা Customer ক্লাসের দুইটা কন্সট্রাক্টর ক্রিয়েট করলাম , তারপর মেইন মেথোড থেকে সেই দুইটা কন্সট্রাক্টর কল করলাম ,একটা কল করার পর -আরেকটা কল করলাম , এই ঘটনাকে Overloading বলে ।। আশা করি বিষয়'টি নিয়ে কিছুটা হলেও ধারণা হয়েছে ।। তো , আজ তাহলে এইটুকুই -----------------
ক্লাস সাধারণত , Data ও Behaviour নিয়ে গঠিত । । এখন আমরা শিখবো , কিভাবে একটা ক্লাসে , কন্সট্রাক্টর , ডিস্ট্রাকটর ক্রিয়েট করতে হয় ???? চলো আমরা একটা সিম্পল কোড দেখে আসি ,
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
Console.ReadKey();
}
}
class Program
{
public static void Main()
{
Customer j = new Customer();
j.Print();
}
}
আমরা , এখানে Customer নামক একটা ক্লাসের ভেতরে , একটা ইন্সট্যান্স মেথড ক্রিয়েট করেছি । ।
তারপর , মেইন মেথড এর ভেতরে এই Customer ক্লাসের একটা ইন্সট্যান্স ক্রিয়েট করেছি , তারপর Print মেথডকে কল করেছি ।। এখন ঘটনা হলো , এখানে আমাদের Customer ক্লাসের ভেতরে Default ভাবে একটা কন্সট্রাক্টর ক্রিয়েট হয়ে গেছে , তাই কম্পাইল হতে কোনো প্রবলেম হলো না । । কন্সট্রাক্ট্র আর ক্লাস নেইম কিন্তু সেইম হতে হয় , এটা মাথায় রাখতে হবে । চলো , এবার আমরা নিজেরা একটা কন্সট্রাকটর ক্রিয়েট করে ফেলি ---
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
// Constructor
public Customer(string FIRSTNAME, string LASTNAME)
{
this._firstname = FIRSTNAME;
this._lastname = LASTNAME;
}
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
Console.ReadKey();
}
// DeConstructor
~Customer()
{
}
}
class Program
{
public static void Main()
{
Customer j = new Customer("Naim","Shahriar");
j.Print();
}
}
আমাদের অবশ্য , DeConstructor ক্রিয়েট করার দরকারই ছিলো না । শি শার্প এর ক্ষেত্রে , এটা গারবেজ কালেক্টর দ্বারা অটোমেটিক্যালই কলড হয় , ক্রিয়েট না করলেও ।। এটা , মূলত বিভিন্ন কন্সট্রাক্টর ও অব্জেক্ট এর কাজ গুলো হবার পর , মেমোরি থেকে এর রিসোর্স গুলো ক্লিন করতে ইউজ করা হয় , তাতে মেমোরি'র সাশ্রয় ঘটে , অন্যথায় এসব মেমোরিকে স্লো করে দেয় ।। এর কোনো রিটার্ন টাইপ থাকে না । সাথে , কোনো প্যারামিটারও থাকে না ।।
যাই হোক , এবার আসি কন্সট্রাকটর এর কথায় -- কন্সট্রাকটর এর নাম ক্লাস এর নামেই হয় , এর ভেতরে প্যারামিটার পাস করা যায় , যেমন - এখানে , আমরা দুইটি স্ট্রিং কে প্যারামিটার হিসেবে পাস করিয়েছি । এর কোনো , রিটার্ন টাইপ থাকে না ।। মেথড ও কন্সট্রাকটর এর সিনট্যাক্স গুলোর মধ্যে এটা খুব বড়ো একটা তফাত । ।
আমাদের এখানে , মূলত দুইটা ক্লাস ফিল্ড _firstname ও _lastname ।
এখানে কন্সট্রাকটর 'টি মূলত দুইটা ক্লাস ফিল্ড কে ইনিশিয়ালাইজ করার জন্য ব্যবহার করেছি । । এবার , আমরা this. ইউজ করে এক এক করে অব্জেক্ট ক্রিয়েট করবো , দুইটা ক্লাস ফিল্ড এর জন্য দুইটা অবজেক্ট ।। এই জন্য , আমরা মেইন মেথোড-এ Customer এর একটা ইন্সট্যান্স/অব্জেক্ট ক্রিয়েট করলেই, এর কন্সট্রাক্টর অটোমেটিক কল হবে । । তাহলে , এই ক্লাস Field কিন্তু ক্লাস এর ডেটা , আর আমরা যে Print মেথড ক্রিয়েট করলাম এটা ক্লাস এর Behaviour । ।
এখন আমরা , যখন মেইন মেথোড -এ Customer j = new Customer("Naim","Shahriar") ; Customer ক্লাসের অব্জেক্ট/ ইন্সট্যান্স ক্রিয়েট এর মাধ্যমে , Customer ক্লাসের কন্সট্রাক্টরকে কল করবো । । তখন , আমরা দুইটি প্যারামিটার পাস করেছি একটা "Naim" ও আরেকটা "Shahriar" ।। এর ফলে , Customer ক্লাস এর কন্সট্রাক্টর সেই প্যারামিটারকে নিয়ে _firstname ও _lastname এর অবজেক্ট এর মাধ্যমে _firstname ও ._lastname তে অ্যাসাইন করে দেয় । যে কারণে , যদিও আমরা আগেই string _firstname="Joy" ও string _lastname="Mollick" অ্যাসাইন করেছি , তারপরো । নতুন করে অ্যাসাইন করার কারণে - আমাকে শেষের'টা দেখাবে ।।
আমরা যদি , মেইনমেথোড এ কোনো , ইন্সট্যান্স ক্রিয়েট করে প্যারামিটার রাখতে না চাই , তাহলে
নিচের মতো Customer ক্লাসেই একটা প্যারামিটারলেস কন্সট্রাক্টর ক্রিয়েট করে নেবো , নিম্ন্রুপভাবে , তাহলে আর আমাদের কোনো সমস্যা হবে না ।।
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
public Customer()
:this("Naim","Shahriar")
{
}
public Customer(string FIRSTNAME, string LASTNAME)
{
this._firstname = FIRSTNAME;
this._lastname = LASTNAME;
}
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
Console.ReadKey();
}
~Customer()
{
}
}
class Program
{
public static void Main()
{
Customer j = new Customer();
j.Print();
}
}
চলো , আমরা একটা কোড দেখে আসি -----------------------------------------
using System;
class Customer
{
string _firstname="Joy";
string _lastname="Mollick";
public Customer()
:this("Naim","Shahriar")
{
}
public Customer(string FIRSTNAME, string LASTNAME)
{
this._firstname = FIRSTNAME;
this._lastname = LASTNAME;
}
public void Print()
{
Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
}
~Customer()
{
}
}
class Program
{
public static void Main()
{
Customer j = new Customer();
j.Print();
Customer h = new Customer("Bill","Gates");
h.Print();
Console.ReadKey();
}
}
এখানে , আমরা একটা Customer ক্লাসের দুইটা কন্সট্রাক্টর ক্রিয়েট করলাম , তারপর মেইন মেথোড থেকে সেই দুইটা কন্সট্রাক্টর কল করলাম ,একটা কল করার পর -আরেকটা কল করলাম , এই ঘটনাকে Overloading বলে ।। আশা করি বিষয়'টি নিয়ে কিছুটা হলেও ধারণা হয়েছে ।। তো , আজ তাহলে এইটুকুই -----------------
No comments:
Post a Comment