Thursday, November 2, 2017

C# For Beginners , Part-38 ( Acces Modifiers In Type Members )



আজকে প্রথমে , আমরা টাইপ মেম্বার এর অ্যাকসেস মোডিফায়ার গুলোর মধ্যে , শুধু তিনটি নিয়ে কথা বলবো ।

Private

Protected

Public


Private -- এই অ্যাকসেস মোডিফায়ার ইউজ করার মানে হলো , আমরা ওই টাইপ মেম্বারকে শুধু ঐ টাইপ (ক্লাস, স্ট্রাক্ট,এনাম , ইত্যাদি ) এর মধ্যেই অ্যাকসেস করতে পারবো , তার বাইরে অন্য কোনো ক্লাসে অথবা , তার ডেরাইভড ক্লাসেও অ্যাকসেস করতে পারবো না ।। শুধুমাত্র ওই টাইপ-এই ইউজ করতে পারবো । ।

Public ---- এই  অ্যাকসেস মোডিফায়ার ইউজ  করলে , তুমি সেই টাইপ মেম্বার কে শুধু ওই টাইপের ভেতরেই নয় , তার বাইরেও - অন্য ক্লাসেও , এমনকি অন্য অ্যাসেম্বলি'তেও ইউজ করতে পারবে ।
( অ্যাসেম্বলি ) নিয়ে পরে কথা বলবো , আপাতত এইটুকু জেনে রাখলেই চলবে ।। পাবলিক অ্যাকসেস মোডিফায়ার একদমই প্রাইভেট এর ঠিক উলটো ।।

Protected--- এই অ্যাকসেস মোডিফায়ার ব্যবহারের ফলে , আমরা সেই টাইপ মেম্বারকে শুধু ওই টাইপে অথবা , ওই টাইপের কোনো ডেরাইভড টাইপে অ্যাকসেস করা যাবে ।। এর বাইরে ইউজ করতে পারবে না তুমি ।। চলো একটা ছোট্ট উদাহরণ দেখে আসি ----------------

using System;
using System.Collections.Generic;


public class joy
{
    protected int id=14 ;
}
public class toy : joy
{
    public  void print()
    {
        Console.WriteLine(id);
    }
}

public class Program
{

    public static void Main()
    {

        toy r = new toy();
        r.print();
        Console.ReadKey();
    }

}
      
   উপরের কোডটা রান করে দেখো ।
  তাহলে আমরা , দেখতেই পেলাম - শুধু ঐ টাইপ-এই নয় , তার বাইরেও -- তার ডেরাইভড ক্লাসেও আমি অ্যাকসেস করতে পারি ।।    
   
 এখন আমরা বাকি দুইটা নিয়ে কথা বলবো ।।  Internal & Protected Internal |


আমরা যখন একটা  শি শার্প প্রোগ্রাম কম্পাইল করাই , তখন তখন অ্যাসেম্বলি ফাইল ক্রিয়েট হয় ( এটা সাধারনত , মেশিন কোড ) , সেটা দুই ধরনের হতে পারে । একটা হলো - এক্সিকিউটেবল ( এর এক্সটেনশন হলো . ( .exe ) [ তুমি যখন , প্রোগ্রাম লিখো - তার ডান পাশেই সলুউশন এক্সপ্লোরারে - সেই প্রোগ্রামের নাম লিখা থাকে যার ভেতরে project কথাটি লিখা থাকে সেখানে ক্লিক করলেই অনেকগুলো অপশন দেখতে পাবে , Open Folder In File Explorer তে ক্লিক করলেই , এই প্রোগ্রামের ফাইল আসে , তাতে ক্লিক করে  bin->Debug গেলেই , তোমার সেই এক্সিকিউটেবল ফাইল ( .exe) দেখতে পাবে ]। এটাই মেশিন কোড ( ইন্টারমিডিয়েট ল্যাংগুয়েজ, যেটা তোমার লিখা সোর্স কোড থেকে ক্রিয়েট হয় ) , যেটা অটোমেটিক জেনারেটেড হয়  ।।

আচ্ছা , এখন এই অ্যাসেম্বলি দুই ধরনের হতে পারে , একটার এক্সটেনশন .exe আরেকটার এক্সটেনশন .dll || তার আগে , আমরা - আমাদের এই প্রোজেক্টের ভেতরে  Add->New Project->Class Library ক্রিয়েট করলাম , আবার । ( খেয়াল রেখ , এটা কিন্তু - কনসল অ্যাপ্লিকেশন  নয় , এটা একটা নতুন ক্লাস লাইব্রেরি ক্রিয়েট করছো - তুমি ) এখন তোমার ফুল প্রোজেক্ট আবার বিল্ড করাও , এখন তোমার খোলা নতুন ক্লাস লাইব্রেরি তে আগের মতো করে Open Folder In File Explorer->bin->Debug তে গেলেই , তোমরা নতুন আরেক ধরনের অ্যাসেম্বলি দেখতে পাবে , যার এক্সটেনশন .dll ।  আচ্ছা , এখন আরো একটা ক্লাস লাইব্রেরি খুলে ফেলো । ।

আচ্ছা , এবার আসি আসল কথায় । । এখন তুমি যে নতুন দুইটা অ্যাসেম্বলি আছে তার  যে কোনো একটাতে   internal অ্যাকসেস মোডিফায়ার ইউজ করে টাইপ মেম্বার ডিক্লেয়ার করো , তাহলে ।  তুমি ওই অ্যাসেম্বলি'র বাইরে সেটা কোনোভাবেই  অ্যাকসেস করতে পারবে না ।।

এবার আসি , Protected Internal এর ব্যাপারে । যদি , তুমি কোনো - একটা অ্যাসেম্বলি'তে একটা ক্লাসে  Protected Internal অ্যাকসেস মোডিফায়ার ইউজ করি , তাহলে সেটা শুধু সেই অ্যাসেম্বলিতেই নয় , অন্য যে কোনো অ্যাসেম্বলি'তে যদি , ওই ক্লাসের ডেরাইভড কোনো ক্লাস ব্যবহার কোনো ক্লাস ব্যবহার করা হয় , তাহলে সেখানে অ্যাকসেস করা যাবে । ।  আশা করি , বিষয়টি অনেকটাই পরিষ্কার হয়ে গেছে ।। এর পরের পর্বে , আমরা আলোচনা করবো - টাইপ এর ক্ষেত্রে অ্যাকসেস মোডিফায়ার এর ব্যবহার নিয়ে ।। তবে এখানে , কিছু ব্যপার আছে ----

তুমি যদি , প্রথম অ্যাসেম্বলি'র ভেতরের ক্লাসে একটা Protected Internal ইউজ করে একটা মেম্বার ডিক্লেয়ার করো ,

using System;
namespace AssemblyLibrary2
{
    public class AssemblytwoClass2
    {
       protected internal int ID = 101;
    }
}

 তারপর সেটা অন্য একটা অ্যাসেম্বলি থেকে ইনহেরিটেন্স ক্লাসের মাধ্যমে অ্যাকসেস করতে চাও , তাহলে তোমায় । সেই অ্যাসেম্বলির রেফারেন্স-এ ক্লিক করে , এই AssemblyLibrary2 কে ইনক্লুড করতে হবে , তারপর using Directory ইউজ করে AssemblyLibrary2 ডিক্লেয়ার করতে হবে , তারপর নিচে দেখো , অন্য অ্যাসেম্বলি এর কোড , যেখান থেকে আমরা  অ্যাকসেস করতে চাচ্ছে ---


using System;
using AssemblyLibrary2;

namespace Assembly1
{
    public class AssemblyoneClass1
    {

    }
   
    public class Joy : AssemblytwoClass2
    {
        public  void print()
        {
            AssemblytwoClass2 r = new AssemblytwoClass2();
            base.ID = 143;
            Joy e = new Joy();
            e.ID = 156;
           
            Console.ReadKey();
        }
    }
}

আমরা  ,প্রথমেই -- সেই AssemblyLibrary2  অ্যাসেম্বলির AssemblytwoClass2 ক্লাস থেকে Joy নামক ক্লাস ডেরাইভড করে নিলাম ।। এখন আমরা , জানি এই Joy ক্লাসটি সেই তার বেইস ক্লাস AssemblytwoClass2 এর সকল মেম্বার অ্যাকসেস করার ক্ষমতা রাখে , সুতরাং আমরা সেটাকে অ্যাকসেসও করলাম , কিন্তু বেইস ক্লাসের অব্জেক্ট ক্রিয়েট করে base অপারেটর ছাড়া আমরা সেটাকে অ্যাকসেস করতে পারবো না , চাইল্ড ক্লাসের অবজেক্ট ক্রিয়েট করে সহজেই অ্যাকসেস করতে পারবো , কারণ - চাইল্ড ক্লাস তার বেইস ক্লাসের সব মেম্বার অ্যাকসেস করার ক্ষমতা রাখে ।। এখন বিল্ড করলে , কোনো এরর দেখাবে না ।।

আশা করি , টাইপ মেম্বার এর ক্ষেত্রে অ্যাকসেস মোডিফায়ার নিয়ে আর কোনো ঝামেলা থাকার কথা নয় ।।





No comments:

Post a Comment