আমরা আজকে , শি শার্প র প্রোপার্টিস নিয়ে কথা বলবো ।। তার আগে বলবো , আমরা আগের পর্বে যে - সেটার ও গেটার মেথড নিয়ে কথা বলেছি ।। আমরা , ঐ পর্বে এটা নিয়ে শধু আলোচনা করেছি এই জন্য যেনো , আমরা বুঝতে পারি , এনক্যাপসিউলেশন কতটা গুরুত্বপূর্ণ।। আমরা এখন থেকে আর ওই মেথোড ইউজ করবো না , আমরা এখন থেকে প্রোপারটিস ইউজ করবো , চলো আগে কোড দেখে আসি -----------------------------
using System;
public class student
{
private int id;
private string name;
private int passmark;
public int ID
{
set{
if(value <=0)
{
throw new Exception("ID Name Should Not Be Nonpositive");
}
this.id=value;
}
get{
return id;
}
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = -101;
Console.ReadKey();
}
}
আচ্ছা , এখন আমরা লাইন বাই লাইন একটু বোঝার ট্রাই করি , কি কি করলাম ।। ID নামে একটা প্রোপার্টি ডিক্লেয়ার করলাম ।। যে প্রোপারটি'র ভেতরে দুইটা অ্যাকসেসার আছে , একটা set অ্যাকসেসার আর একটা get অ্যাকসেসার | তারপরে , value নামে একটা কিওয়ারড ইউজ করেছি ।।
এখন ঘটনা হলো , মেইন মেথোড -এ এসে যখন - আমি কিভাবে কল করবো এই প্রোপারটি'কে ??
এটাও খুবই সোজা , student c1 = new student(); এর মাধ্যমে student নামক ক্লাস এর অবজেক্ট ক্রিয়েট করলাম ।। এখন , এই রেফারেন্স ভ্যারিয়েবল c1 এর সাথে যদি - ডট অপারেটর দিয়ে প্রোপারটি'র নাম লিখি ( c1.ID ) ।। তাহলেই প্রোপারটি কল হবে , কিছুটা ক্লাস ফিল্ড এর মতোই ।।
আচ্ছা আমরা যখন , c1.ID = -101 ; লিখলাম তখন - আমাদের ID প্রোপারটিস -101 ভ্যালুটিকে নিয়ে
নেয় , তারপর set নামক অ্যাকসেসারকে কল করে , তারপর এর ভেতরে value কিওয়ারড -টা সেই ভ্যালু টেইক করে , কিছুটা মেথোড এর প্যারামিটার এর মতো , মেথোডে যাই পাস করাই না কেনো , সেগুলো প্যারামিটারে অ্যাসাইন করে নেয় ।।
এখানেও , value কিওয়ারড সেই কাজ করে , তারপর তো কি হয় ??? বুঝতেই পারছো ।। value কিওয়ারড -টা যে শুধু ইন্টিজার ভ্যালূ টেইক করে তা কিন্তু নয় , তুমি যে ধরনের প্রোপার্টি ডিক্লেয়ার করবা সেই ধরনের ভ্যালু নিতে পারবে , আমরা এখানে
public int ID মানে , value কিওয়ারড -টা শুধু এই প্রোপারটির জন্য ইন্টিজ্রার ভ্যালু নিতে পারবে ।।
এখন ঘটনা হলো ।। এটা না হয় , হলো --- কিন্তু , আমি যখন কনসল স্ক্রিনে শো করাতে যাবো , এই ভ্যালু - তখন কি করে রিড হবে ?? কি করবো ?? চলো দেখে আসি ।।
using System;
public class student
{
private int id;
private string name;
private int passmark;
public int ID
{
set{
if(value <=0)
{
throw new Exception("ID Name Should Not Be Nonpositive");
}
this.id=value;
}
get{
return id;
}
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = 101;
Console.WriteLine("Student ID no. {0}", c1.ID);
Console.ReadKey();
}
}
আচ্ছা , এখন কোড'টা রান করে দেখো ।। হুম , ঠিকঠাক আওউটপুট পাচ্ছি ।। আচ্ছা , দেখো একটা জিনিস লক্ষ করো যে -- কন্সল স্ক্রিনে শো করানোর জন্যও কিন্তু , আমরা c1.ID একই কাজ করেছি , যে কাজটি করেছিলাম , সেট করার সময় ।।
তাহলে বলো তো ?? আমরা , দুইটা কাজের জন্য একই জিনিস ইউজ করলাম , তারপরো কমপাইলার কিভাবে বুঝলো ?? আমরা কখন কোন'টা করতে চাচ্ছি ??
আসলে , শি শার্প তার প্রোপার্টি এর ক্ষেত্রে অটোমেটিক বুঝে নেয় যে , তুমি কি করতে চাচ্ছো ?? তুমি যদি সেট করার জন্য c1.ID = 101 লেখো , তাহলে বুঝে নিবে তুমি set অ্যাকসেসার চাচ্ছো ।। আর , যখন তুমি কন্সল স্ক্রিনে দেখানোর জন্য ভ্যালু রিড করতে চাও , তখন c1.ID ইউজ করলে , বুঝে নিবে তুমি get অ্যাকসেসার চাচ্ছো | খুবই সিম্পল ।। তোমায় , আলাদা করে আবার অন্য একটা গেট মেথোড খুলতে হলো না ।। তাহলে আমাদের এই ID নামক প্রোপারটি'টা একটা Read & write প্রোপারটি । এর দুই ধরনের অ্যাকসেসারই আছে ।।
এখন মনে করো যে , আমি এমন একটা প্রোপারটি ক্রিয়েট করতে চাই যেখানে শধু get অ্যাকসেসার থাকবে , এর মানে - আমি ক্লাস ফিল্ড এর ভ্যালু শুধু রিড করে কন্সল স্ক্রিনে শো করাতে পারবো ।। তাহলে কি করা যায় ??? চলো দেখে আসি ------------
using System;
public class student
{
private int id;
private string name;
private int passmark=40;
public int Passmark
{
get
{
return this.passmark;
}
}
public int ID
{
set{
if(value <=0)
{
throw new Exception("ID Name Should Not Be Nonpositive");
}
this.id=value;
}
get{
return id;
}
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = 101;
Console.WriteLine("Student ID no. {0}", c1.ID);
Console.WriteLine("Student Passmark {0}", c1.Passmark);
Console.ReadKey();
}
}
সুতরাং , আমরা Passmark নামে শুধু রিড অনলি প্রোপারটি ক্রিয়েট করেছি ।
আচ্ছা , এখন আসো আরো সহজ একটি হিসাবে ।। সেটা হলো , আমাদের এই পোপারটি'র আরো কিছু বিশেষ গুণ আছে , যার জন্য আমরা গেটিং ও সেটিং মেথোড থেকে এই প্রোপারটি ব্যবহার করবো । ধরো , তুমি কিছুক্ষণের জন্য মেনে নাও স্টুডেন্ট আইডি নেগেটিভ হলে প্রোবলেম নাই ।।
আমাদের সেট অ্যাকসেসার এর মধ্যে কোনো ইফ- এলস লজিক এর দরকার নেই , আর Passmark কে রিড অনলি ও রাইট অনলি উভয় প্রোপারটি বানিয়ে দিলাম ।। আচ্ছা এখন নিচের কোড দেখো ।।
using System;
public class student
{
public int Passmark
{
set;
get;
}
public int ID
{
set;
get;
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = 101;
c1.Passmark = 40;
Console.WriteLine("Student ID no. {0}", c1.ID);
Console.WriteLine("Student Passmark {0}", c1.Passmark);
Console.ReadKey();
}
}
আচ্ছা , কোড'টি রান করে দেখো , কি হয় ??? আশা করি , অলরেডি বুঝতে পেরেছো , তারপরো বলছি ।। আমাদের এই প্রোপারটির বড়ো একটা সুবিধা হলো , আমাদের যদি কোনো লজিক সেট করা না লাগে , তাহলে -- আমাদের ওইসব ক্লাস ফিল্ডকে ইনিশিয়ালাইজ করার কোনো দরকারই নেই , শুধু
প্রোপারটি ক্রিয়েট করলেই ,কম্পাইলার অটোমেটিক প্রোপারটি গুলোর ক্লাস ফিল্ড ক্রিয়েট করে দিবে ।। যা্রা একটু অলস , তাদের জন্য অবশ্য খুবই সহজ হলো , কষ্ট করে ক্লাসফিল্ড ইমপ্লিমেন্টন করতে হবে না ।।
তো যাই হোক , আমরা কখনোই ট্র্যাডিশনাল গেটার / সেটার মেথোড ইউজ না করে আমাদের প্রোপারটি ইউজ করবো ।। প্রোপারটি'র ব্যাপারগুলো আশা করি , ভালো করে বুঝতে পেরেছো ।।
আজ এইটুকুই তাহলে --------------------
using System;
public class student
{
private int id;
private string name;
private int passmark;
public int ID
{
set{
if(value <=0)
{
throw new Exception("ID Name Should Not Be Nonpositive");
}
this.id=value;
}
get{
return id;
}
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = -101;
Console.ReadKey();
}
}
আচ্ছা , এখন আমরা লাইন বাই লাইন একটু বোঝার ট্রাই করি , কি কি করলাম ।। ID নামে একটা প্রোপার্টি ডিক্লেয়ার করলাম ।। যে প্রোপারটি'র ভেতরে দুইটা অ্যাকসেসার আছে , একটা set অ্যাকসেসার আর একটা get অ্যাকসেসার | তারপরে , value নামে একটা কিওয়ারড ইউজ করেছি ।।
এখন ঘটনা হলো , মেইন মেথোড -এ এসে যখন - আমি কিভাবে কল করবো এই প্রোপারটি'কে ??
এটাও খুবই সোজা , student c1 = new student(); এর মাধ্যমে student নামক ক্লাস এর অবজেক্ট ক্রিয়েট করলাম ।। এখন , এই রেফারেন্স ভ্যারিয়েবল c1 এর সাথে যদি - ডট অপারেটর দিয়ে প্রোপারটি'র নাম লিখি ( c1.ID ) ।। তাহলেই প্রোপারটি কল হবে , কিছুটা ক্লাস ফিল্ড এর মতোই ।।
আচ্ছা আমরা যখন , c1.ID = -101 ; লিখলাম তখন - আমাদের ID প্রোপারটিস -101 ভ্যালুটিকে নিয়ে
নেয় , তারপর set নামক অ্যাকসেসারকে কল করে , তারপর এর ভেতরে value কিওয়ারড -টা সেই ভ্যালু টেইক করে , কিছুটা মেথোড এর প্যারামিটার এর মতো , মেথোডে যাই পাস করাই না কেনো , সেগুলো প্যারামিটারে অ্যাসাইন করে নেয় ।।
এখানেও , value কিওয়ারড সেই কাজ করে , তারপর তো কি হয় ??? বুঝতেই পারছো ।। value কিওয়ারড -টা যে শুধু ইন্টিজার ভ্যালূ টেইক করে তা কিন্তু নয় , তুমি যে ধরনের প্রোপার্টি ডিক্লেয়ার করবা সেই ধরনের ভ্যালু নিতে পারবে , আমরা এখানে
public int ID মানে , value কিওয়ারড -টা শুধু এই প্রোপারটির জন্য ইন্টিজ্রার ভ্যালু নিতে পারবে ।।
এখন ঘটনা হলো ।। এটা না হয় , হলো --- কিন্তু , আমি যখন কনসল স্ক্রিনে শো করাতে যাবো , এই ভ্যালু - তখন কি করে রিড হবে ?? কি করবো ?? চলো দেখে আসি ।।
using System;
public class student
{
private int id;
private string name;
private int passmark;
public int ID
{
set{
if(value <=0)
{
throw new Exception("ID Name Should Not Be Nonpositive");
}
this.id=value;
}
get{
return id;
}
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = 101;
Console.WriteLine("Student ID no. {0}", c1.ID);
Console.ReadKey();
}
}
আচ্ছা , এখন কোড'টা রান করে দেখো ।। হুম , ঠিকঠাক আওউটপুট পাচ্ছি ।। আচ্ছা , দেখো একটা জিনিস লক্ষ করো যে -- কন্সল স্ক্রিনে শো করানোর জন্যও কিন্তু , আমরা c1.ID একই কাজ করেছি , যে কাজটি করেছিলাম , সেট করার সময় ।।
তাহলে বলো তো ?? আমরা , দুইটা কাজের জন্য একই জিনিস ইউজ করলাম , তারপরো কমপাইলার কিভাবে বুঝলো ?? আমরা কখন কোন'টা করতে চাচ্ছি ??
আসলে , শি শার্প তার প্রোপার্টি এর ক্ষেত্রে অটোমেটিক বুঝে নেয় যে , তুমি কি করতে চাচ্ছো ?? তুমি যদি সেট করার জন্য c1.ID = 101 লেখো , তাহলে বুঝে নিবে তুমি set অ্যাকসেসার চাচ্ছো ।। আর , যখন তুমি কন্সল স্ক্রিনে দেখানোর জন্য ভ্যালু রিড করতে চাও , তখন c1.ID ইউজ করলে , বুঝে নিবে তুমি get অ্যাকসেসার চাচ্ছো | খুবই সিম্পল ।। তোমায় , আলাদা করে আবার অন্য একটা গেট মেথোড খুলতে হলো না ।। তাহলে আমাদের এই ID নামক প্রোপারটি'টা একটা Read & write প্রোপারটি । এর দুই ধরনের অ্যাকসেসারই আছে ।।
এখন মনে করো যে , আমি এমন একটা প্রোপারটি ক্রিয়েট করতে চাই যেখানে শধু get অ্যাকসেসার থাকবে , এর মানে - আমি ক্লাস ফিল্ড এর ভ্যালু শুধু রিড করে কন্সল স্ক্রিনে শো করাতে পারবো ।। তাহলে কি করা যায় ??? চলো দেখে আসি ------------
using System;
public class student
{
private int id;
private string name;
private int passmark=40;
public int Passmark
{
get
{
return this.passmark;
}
}
public int ID
{
set{
if(value <=0)
{
throw new Exception("ID Name Should Not Be Nonpositive");
}
this.id=value;
}
get{
return id;
}
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = 101;
Console.WriteLine("Student ID no. {0}", c1.ID);
Console.WriteLine("Student Passmark {0}", c1.Passmark);
Console.ReadKey();
}
}
সুতরাং , আমরা Passmark নামে শুধু রিড অনলি প্রোপারটি ক্রিয়েট করেছি ।
আচ্ছা , এখন আসো আরো সহজ একটি হিসাবে ।। সেটা হলো , আমাদের এই পোপারটি'র আরো কিছু বিশেষ গুণ আছে , যার জন্য আমরা গেটিং ও সেটিং মেথোড থেকে এই প্রোপারটি ব্যবহার করবো । ধরো , তুমি কিছুক্ষণের জন্য মেনে নাও স্টুডেন্ট আইডি নেগেটিভ হলে প্রোবলেম নাই ।।
আমাদের সেট অ্যাকসেসার এর মধ্যে কোনো ইফ- এলস লজিক এর দরকার নেই , আর Passmark কে রিড অনলি ও রাইট অনলি উভয় প্রোপারটি বানিয়ে দিলাম ।। আচ্ছা এখন নিচের কোড দেখো ।।
using System;
public class student
{
public int Passmark
{
set;
get;
}
public int ID
{
set;
get;
}
}
public class Program
{
public static void Main()
{
student c1 = new student();
c1.ID = 101;
c1.Passmark = 40;
Console.WriteLine("Student ID no. {0}", c1.ID);
Console.WriteLine("Student Passmark {0}", c1.Passmark);
Console.ReadKey();
}
}
আচ্ছা , কোড'টি রান করে দেখো , কি হয় ??? আশা করি , অলরেডি বুঝতে পেরেছো , তারপরো বলছি ।। আমাদের এই প্রোপারটির বড়ো একটা সুবিধা হলো , আমাদের যদি কোনো লজিক সেট করা না লাগে , তাহলে -- আমাদের ওইসব ক্লাস ফিল্ডকে ইনিশিয়ালাইজ করার কোনো দরকারই নেই , শুধু
প্রোপারটি ক্রিয়েট করলেই ,কম্পাইলার অটোমেটিক প্রোপারটি গুলোর ক্লাস ফিল্ড ক্রিয়েট করে দিবে ।। যা্রা একটু অলস , তাদের জন্য অবশ্য খুবই সহজ হলো , কষ্ট করে ক্লাসফিল্ড ইমপ্লিমেন্টন করতে হবে না ।।
তো যাই হোক , আমরা কখনোই ট্র্যাডিশনাল গেটার / সেটার মেথোড ইউজ না করে আমাদের প্রোপারটি ইউজ করবো ।। প্রোপারটি'র ব্যাপারগুলো আশা করি , ভালো করে বুঝতে পেরেছো ।।
আজ এইটুকুই তাহলে --------------------
No comments:
Post a Comment