Tuesday, October 17, 2017

C# For Beginners , Part - 31 ( Abstract Classes Basics, Differences Between Abstract Calsses & Interface)

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


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

চলো সিম্পল দেখে আসি ----

using System;

public abstract class Customer
{
    public void print()
    {
        Console.WriteLine("Hey Joy");
    }
}
public class Program
{
    public static void Main()
    {
        Customer r = new Customer();
        r.print();
        Console.ReadKey();
    }

}

এখানে আমরা অ্যাবস্ট্রাক্ট ক্লাস  এর অব্জেক্ট ক্রিয়েট করেছি , তাই এটা রান করালে এরর খাবা ।।
তাহলে কি করা যায় ???  কিভাবে - এর মেথোড'টা কল করা যায় ????

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

using System;

public abstract class Customer
{
    public abstract void print();
   
}
public class joy : Customer
{
    public override void print()
    {
        Console.WriteLine("Hey Joy");
    }
}
public class Program
{
    public static void Main()
    {
        joy r = new joy();
        r.print();
        Console.ReadKey();
    }

}


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


 public abstract class Customer
{
     private abstract void print();                              public abstract class Customer
                                                                            {
   }                                                                             abstract void print();       
                                                                                }


উপরের যে কোনো একটার মতো করে লিখলে এরর খাবা ।। অ্যাবস্ট্রাক্ট মেম্বার কখনো প্রাইভেট হতে পারে না ।। কিন্তু , অ্যাবস্ট্রাক্ট ক্লাসের ভেতরের নরমাল মেথোড ইমপ্লিমেন্টেশন পাবলিক / অরাইভেট হতে পারে ।।

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

using System;

public abstract class Customer
{
   public abstract void print();
   
   
}
public class joy : Customer
{
   public override void print()
   {
       Console.WriteLine("Hi");
   }
}
public class Program
{
    public static void Main()
    {
        Customer r = new joy();
        r.print();
        Console.ReadKey();
    }

}



তুমি এই ক্ষেত্রে ইনহেরিটেন্স এর ক্ষেত্রে ঠিকই ইটারফেইস এর মতোই একটা অ্যাবস্ট্রাক্ট থেকে আরো একটা অ্যাবস্ট্রাক্ট ক্লাস ইনহেরিটেড করতে পারবা ----

public abstract class Customer
{
   public abstract void print();
   
   
}
public abstract class joy : Customer
{
    public abstract void print1();
  
}

বাট তুমি যখন আবার , ইনহেরিটেড  অ্যাবস্ট্রাক্ট ক্লাস থেকে -- আরেকটা নরমাল ক্লাস ডেরাইভড করবা তখন তোমায় দুইটি অ্যাবস্ট্রাক্ট ক্লাসেরই মেথোড ইমপ্লিমেন্টেশন করতে হবে , ঠিক ইন্টারফেইস এর মতো , না হলে কম্পাইল টাইম এরর খাবা  ----

public abstract class Customer
{
   public abstract void print();
   
   
}
public abstract class joy : Customer
{
    public abstract void print1();
  
}

public class jony : joy
{
    public override void print1()
    {
       
    }

    public override void print()
    {
       
    }
   
}

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

public sealed abstract class Customer

{
   public abstract void print();
}


তুমি কিনতু , ইন্টারফেইস -এর ক্ষেত্রে ক্লাস ফিল্ড ইউজ করতে পারতে না , বাট এখানে সেটা ইউজ করতে পারবে ।।

public  abstract class Customer
{
    public int id;
    public string name;
   public abstract void print();
  
}



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

public interface joy
{

}

public  abstract class ICustomer:joy
{
  
}

বাট  অ্যাবস্ট্রাক্ট ক্লাস থেকে , ইন্টারফেইস ইনহেরিটেড করা যায় না ।।

public abstract class  joy
{

}

public  interface ICustomer:joy
{
  
}

 অ্যাবস্ট্রাক্ট ক্লাস থেকে , ইন্টারফেইস ইনহেরিটেড করলে এরর খাবা ।।

আরো একটি বিষয় জেনে রাখা উচিত - একটা ক্লাস একাধিক ইন্টারফেইস থেকে ইনহেরিটেড হতে পারে , বাট একটা ক্লাস একাধিক অ্যাবস্ট্রাক্ট ক্লাস থেকে ইনহেরিটেড হতে পারে না ।।


যাই হোক , মোটামুটি অ্যাবস্ট্রাক্ট ক্লাস এর ফিয়েচার /সিন্ট্যাক্স নিয়ে কিছু বেসিক আলোচনা হলো , সামনে আরো ডিটেইলস আলোচনা করবো , আজ এইটুকুই --------------



No comments:

Post a Comment