Tuesday, October 10, 2017

C# For Beginners, Part-19 ( Class )

                   আজকে ,  আমরা ক্লাস নিয়ে বেসিক কিছু ধারণা নেবার চেষ্টা করবো ,চলো ।

 ক্লাস সাধারণত , 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