আজকে আমরা মজার একটা বিষয় নিয়ে কথা বলবো ।। আর সেটা হলো , স্ট্যাটিক ও ইন্সট্যান্স ক্লাস মেম্বার .।। আমরা এর আগে স্ট্যাটিক ও ইন্সট্যান্স মেথড নিয়ে পড়েছি , বাট আজকে এদের ক্লাস মেম্বার নিয়ে কথা বলবো ।। চলো , আগে একটা সহজ একটা কোড দেখে আসি ----------
using System;
class Circle
{
double pi = 3.1456;
int _radius;
public Circle(int Radius)
{
this._radius=Radius;
}
public double GetArea()
{
return this.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle c1 = new Circle(6);
double area = c1.GetArea();
Console.WriteLine(area);
Circle c2 = new Circle(5);
double area2 = c2.GetArea();
Console.WriteLine(area2);
Console.ReadKey();
}
}
Circle নামক ক্লাসের দুইটা ক্লাস ফিল্ড একটা pi ও আরেকটা _radius ।। দুইটাই ইন্সট্যান্স ক্লাস মেম্বার ।। pi তো ইনিশিয়ালাইজ করাই আছে , এখন _radius ক্লাস ফিল্ড-কে ইনিসিয়ালাইজ করতে , একটা কন্সট্রাক্টর ইউজ করলাম ।।
তারপর একটা , GetArea নামে মেথড ক্রিয়েট করলাম ।। এখন Program নামক ক্লাসের অন্তর্ভুক্ত
মেইন মেথড -এ এসে , Circle নামক ক্লাসের দুইটা ইন্সট্যান্স ( অব্জেক্ট ) ক্রিয়েট করলাম ।। দুই ক্ষেত্রেই , আমি দুই মানের প্যারামিটার পাস করেছি একবার 6 আরেকবার 5 ।। তো প্রতিবারই , মেমোরিতে আলাদা অবজেক্ট ক্রিয়েট করছি , যার ভেতরে pi ও _radius বার বার কপি হয়েছে , আমরা যতোবার অব্জেক্ট ক্রিয়েট করবো , ততোবারই এই দুটি জিনিস বার বার কপি হবে । ।
কিন্তু , আমরা কিন্তু বুঝতেই পারছি যে --- পাই এর মান'টা কন্সট্যান্ট তাই আমরা , এটাকে ইন্সট্যান্স ক্লাস মেম্বার হিসেবে না ব্যবহার করে , স্ট্যাটিক ক্লাস মেম্বার হিসেবে ইউজ করতে পারি ।। তাহলে , আমরা যতোবারই অবজেক্ট / ইন্সট্যান্স ক্রিয়েট করি না কেনো , পাই এর মান কপি হবে না , তাতে মেমোরি'র কিছুটা হলেও সাশ্রয় হবে ।।তো চলো , করেই দেখি - কেমন হয় ?????
using System;
class Circle
{
static double pi = 3.1456;
int _radius;
public Circle(int Radius)
{
this._radius=Radius;
}
public double GetArea()
{
return Circle.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle c1 = new Circle(6);
double area = c1.GetArea();
Console.WriteLine(area);
Circle c2 = new Circle(5);
double area2 = c2.GetArea();
Console.WriteLine(area2);
Console.ReadKey();
}
}
এখানে , আমাদের কি কি পরিবর্তন হয়েছে ? চিন্তা করো তো ।। আমরা , পাই কে স্ট্যাটিক ক্লাস মেম্বার হিসেবে ব্যবহার করেছি ।। তাই , GetArea এর মেথডের ভিতরে return Circle.pi * this._radius * this._radius;ইউজ করেছি । আগেরবার কিন্তু , আমরা return this.pi * this._radius * this._radius; ইউজ করেছিলাম ।।
কিন্তু , গতোবার ইন্সট্যান্স ক্লাস মেম্বার ছিলো - তাই ইন্সট্যান্স ক্রিয়েট করে কাজ করেছিলাম , কিন্তু এইবার কিন্তু এই কাজ ভুলেও করা যাবে না ।। কারণ , এইবার আমরা স্ট্যাটিক ক্লাস মেম্বার ইউজ করেছি , তাই এবার - শুধু ডট অপারেটরের সাহায্যে ক্লাসের নাম জুড়ে দিলেই হবে (Circle.pi ) ।।
আচ্ছা , অনেকেরই মনে হতে পারে ।। আমরা যেমন , ইন্সট্যান্স ক্লাস মেম্বার এর জন্য কন্সট্রাক্টর ইউজ করেছি , ঠিক সেইভাবেই - স্ট্যাটিক ক্লাস মেম্বার এর জন্যও , কন্সট্রাক্টর ইউজ করবো ।।
চলো , কিভাবে এই ক্ষেত্রে - কন্সট্রাক্টর ব্যবহার করতে হয় ?? দেখে আসি ----------------
using System;
class Circle
{
static double pi;
int _radius;
static Circle()
{
Circle.pi = 3.1456;
}
public Circle(int Radius)
{
this._radius=Radius;
}
public double GetArea()
{
return Circle.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle c1 = new Circle(6);
double area = c1.GetArea();
Console.WriteLine(area);
Circle c2 = new Circle(5);
double area2 = c2.GetArea();
Console.WriteLine(area2);
Console.ReadKey();
}
}
একটা জিনিস মনে রাখা উচিত আমাদের , ইন্সট্যান্স কন্সট্রাক্টরের মতো স্ট্যাটিক কন্সট্রাক্টরের ব্যবহারের সময় Access Modifier হিসেবে public / private ইউজ করা যাবে না ।। এটা অটোমেটিক কল হবে , সমস্যা হবে না । কিন্তু , ইন্সট্যান্স কন্সট্রাক্টরের সময় কিন্তু -- public লিখে দিতে হবে , অন্যথায় - ডিফলটভাবে এটা private হয়ে যাবে , যখন একই ক্লাসের বাইরে থেকে আর অ্যাকসেস করা যাবে না ।।
স্ট্যাটিক কন্সট্রাক্টর যদি কখনো ইউজ করা হয় , সেটা শুধু একবারই কল হবে এবং ,সেটা অটোমেটিক সবসময় আগে কল হয় , চলো একটা উদাহরণ দেখে আসি ----------------
using System;
class Circle
{
public static double pi;
int _radius;
static Circle()
{
Circle.pi = 3.1456;
Console.WriteLine("This is static");
}
public Circle(int Radius)
{
Console.WriteLine("This is instanse");
this._radius=Radius;
}
public double GetArea()
{
return Circle.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle t = new Circle(5);
double area=t.GetArea();
Console.WriteLine(area);
Console.ReadKey();
}
}
আমরা এখানে , Circle ক্লাসের একটা অবজেক্ট মাত্র ক্রিয়েট করেছি , আমি যদি একশটা অবজেক্টও ক্রিয়েট করতাম , তাহলেও --- ঐ প্রথম একবারই স্ট্যাটিক কন্সট্রাক্টর'টি কল হবে ।। নিজে নিজে প্র্যাক্টিস করো , আরো ভালো বুঝতে পারবে , তো যাই হোক , আজ এইটুকুই ------------------------------
using System;
class Circle
{
double pi = 3.1456;
int _radius;
public Circle(int Radius)
{
this._radius=Radius;
}
public double GetArea()
{
return this.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle c1 = new Circle(6);
double area = c1.GetArea();
Console.WriteLine(area);
Circle c2 = new Circle(5);
double area2 = c2.GetArea();
Console.WriteLine(area2);
Console.ReadKey();
}
}
Circle নামক ক্লাসের দুইটা ক্লাস ফিল্ড একটা pi ও আরেকটা _radius ।। দুইটাই ইন্সট্যান্স ক্লাস মেম্বার ।। pi তো ইনিশিয়ালাইজ করাই আছে , এখন _radius ক্লাস ফিল্ড-কে ইনিসিয়ালাইজ করতে , একটা কন্সট্রাক্টর ইউজ করলাম ।।
তারপর একটা , GetArea নামে মেথড ক্রিয়েট করলাম ।। এখন Program নামক ক্লাসের অন্তর্ভুক্ত
মেইন মেথড -এ এসে , Circle নামক ক্লাসের দুইটা ইন্সট্যান্স ( অব্জেক্ট ) ক্রিয়েট করলাম ।। দুই ক্ষেত্রেই , আমি দুই মানের প্যারামিটার পাস করেছি একবার 6 আরেকবার 5 ।। তো প্রতিবারই , মেমোরিতে আলাদা অবজেক্ট ক্রিয়েট করছি , যার ভেতরে pi ও _radius বার বার কপি হয়েছে , আমরা যতোবার অব্জেক্ট ক্রিয়েট করবো , ততোবারই এই দুটি জিনিস বার বার কপি হবে । ।
কিন্তু , আমরা কিন্তু বুঝতেই পারছি যে --- পাই এর মান'টা কন্সট্যান্ট তাই আমরা , এটাকে ইন্সট্যান্স ক্লাস মেম্বার হিসেবে না ব্যবহার করে , স্ট্যাটিক ক্লাস মেম্বার হিসেবে ইউজ করতে পারি ।। তাহলে , আমরা যতোবারই অবজেক্ট / ইন্সট্যান্স ক্রিয়েট করি না কেনো , পাই এর মান কপি হবে না , তাতে মেমোরি'র কিছুটা হলেও সাশ্রয় হবে ।।তো চলো , করেই দেখি - কেমন হয় ?????
using System;
class Circle
{
static double pi = 3.1456;
int _radius;
public Circle(int Radius)
{
this._radius=Radius;
}
public double GetArea()
{
return Circle.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle c1 = new Circle(6);
double area = c1.GetArea();
Console.WriteLine(area);
Circle c2 = new Circle(5);
double area2 = c2.GetArea();
Console.WriteLine(area2);
Console.ReadKey();
}
}
এখানে , আমাদের কি কি পরিবর্তন হয়েছে ? চিন্তা করো তো ।। আমরা , পাই কে স্ট্যাটিক ক্লাস মেম্বার হিসেবে ব্যবহার করেছি ।। তাই , GetArea এর মেথডের ভিতরে return Circle.pi * this._radius * this._radius;ইউজ করেছি । আগেরবার কিন্তু , আমরা return this.pi * this._radius * this._radius; ইউজ করেছিলাম ।।
কিন্তু , গতোবার ইন্সট্যান্স ক্লাস মেম্বার ছিলো - তাই ইন্সট্যান্স ক্রিয়েট করে কাজ করেছিলাম , কিন্তু এইবার কিন্তু এই কাজ ভুলেও করা যাবে না ।। কারণ , এইবার আমরা স্ট্যাটিক ক্লাস মেম্বার ইউজ করেছি , তাই এবার - শুধু ডট অপারেটরের সাহায্যে ক্লাসের নাম জুড়ে দিলেই হবে (Circle.pi ) ।।
আচ্ছা , অনেকেরই মনে হতে পারে ।। আমরা যেমন , ইন্সট্যান্স ক্লাস মেম্বার এর জন্য কন্সট্রাক্টর ইউজ করেছি , ঠিক সেইভাবেই - স্ট্যাটিক ক্লাস মেম্বার এর জন্যও , কন্সট্রাক্টর ইউজ করবো ।।
চলো , কিভাবে এই ক্ষেত্রে - কন্সট্রাক্টর ব্যবহার করতে হয় ?? দেখে আসি ----------------
using System;
class Circle
{
static double pi;
int _radius;
static Circle()
{
Circle.pi = 3.1456;
}
public Circle(int Radius)
{
this._radius=Radius;
}
public double GetArea()
{
return Circle.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle c1 = new Circle(6);
double area = c1.GetArea();
Console.WriteLine(area);
Circle c2 = new Circle(5);
double area2 = c2.GetArea();
Console.WriteLine(area2);
Console.ReadKey();
}
}
একটা জিনিস মনে রাখা উচিত আমাদের , ইন্সট্যান্স কন্সট্রাক্টরের মতো স্ট্যাটিক কন্সট্রাক্টরের ব্যবহারের সময় Access Modifier হিসেবে public / private ইউজ করা যাবে না ।। এটা অটোমেটিক কল হবে , সমস্যা হবে না । কিন্তু , ইন্সট্যান্স কন্সট্রাক্টরের সময় কিন্তু -- public লিখে দিতে হবে , অন্যথায় - ডিফলটভাবে এটা private হয়ে যাবে , যখন একই ক্লাসের বাইরে থেকে আর অ্যাকসেস করা যাবে না ।।
স্ট্যাটিক কন্সট্রাক্টর যদি কখনো ইউজ করা হয় , সেটা শুধু একবারই কল হবে এবং ,সেটা অটোমেটিক সবসময় আগে কল হয় , চলো একটা উদাহরণ দেখে আসি ----------------
using System;
class Circle
{
public static double pi;
int _radius;
static Circle()
{
Circle.pi = 3.1456;
Console.WriteLine("This is static");
}
public Circle(int Radius)
{
Console.WriteLine("This is instanse");
this._radius=Radius;
}
public double GetArea()
{
return Circle.pi * this._radius * this._radius;
}
}
class Program
{
public static void Main()
{
Circle t = new Circle(5);
double area=t.GetArea();
Console.WriteLine(area);
Console.ReadKey();
}
}
আমরা এখানে , Circle ক্লাসের একটা অবজেক্ট মাত্র ক্রিয়েট করেছি , আমি যদি একশটা অবজেক্টও ক্রিয়েট করতাম , তাহলেও --- ঐ প্রথম একবারই স্ট্যাটিক কন্সট্রাক্টর'টি কল হবে ।। নিজে নিজে প্র্যাক্টিস করো , আরো ভালো বুঝতে পারবে , তো যাই হোক , আজ এইটুকুই ------------------------------
No comments:
Post a Comment