Thursday, October 12, 2017

C# For Beginners , Part -22 (Method Hiding)

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

using System;

public class Employee
{
    public string FirstName;
    public string LastName;
    public void printFullName()
    {
        Console.WriteLine(FirstName + " " + LastName);
    }
}
public class PartTimeEmployee:Employee
{

}
public class FulltimeEmployee:Employee
{

}

    class Program
    {
        static void Main()

        {
            PartTimeEmployee PTE = new PartTimeEmployee();
            PTE.FirstName = "Part Time";
            PTE.LastName = " Employee";
            PTE.printFullName();

            FulltimeEmployee FTE = new FulltimeEmployee();
            FTE.FirstName = "Full Time";
            FTE.LastName = " Employee";
            FTE.printFullName();
            Console.ReadKey();
        }
    }

এখন ধরো , আমায় বলা হলো যে --  PartTimeEmployee এর জন্য আমি স্পেসিফিকভাবে আরো কিছু প্রিন্ট করতে চাই ।। এখন তুমি , চিন্তা করো যে - তুমি কি করবে ?? কারণ , তুমি যখনই প্রিন্ট করাচ্ছো , তখনই অটমেটিক ভাবে শুধু ভ্যারিয়েবল গুলো ( FirstName,LastName )  চেইঞ্জ করে সেই প্যারেন্ট ক্লাসের মেথোড  প্রিন্ট করাচ্ছ ।। এখন , যখন যে কোনো একটার জন্য স্পেসিফিকভাবে কিছু প্রিট করাতে চাচ্ছো , তখন তোমায় শুধু সেই ক্লাসের জন্য , তার প্যারেন্ট ক্লাসের মেথোড কে হাইড করতে হবে ।। চলো , এর সিম্পল একটা উদাহরণ দেখে আসি ----------------

using System;

public class Employee
{
    public string FirstName;
    public string LastName;
    public void printFullName()
    {
        Console.WriteLine(FirstName + " " + LastName);
    }
}
public class PartTimeEmployee:Employee
{
    public void printFullName()
    {
        Console.WriteLine(FirstName + " " + LastName+" Part Time Man");
    }
}
public class FulltimeEmployee:Employee
{

}

    class Program
    {
        static void Main()

        {
            PartTimeEmployee PTE = new PartTimeEmployee();
            PTE.FirstName = "Part Time";
            PTE.LastName = " Employee";
            PTE.printFullName();

            FulltimeEmployee FTE = new FulltimeEmployee();
            FTE.FirstName = "Full Time";
            FTE.LastName = " Employee";
            FTE.printFullName();
            Console.ReadKey();
        }
    }

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

using System;

public class Employee
{
    public string FirstName;
    public string LastName;
    public void printFullName()
    {
        Console.WriteLine(FirstName + " " + LastName);
    }
}
public class PartTimeEmployee:Employee
{
    public new void printFullName()
    {
        Console.WriteLine(FirstName + " " + LastName+" Part Time Man");
    }
}
public class FulltimeEmployee:Employee
{

}

    class Program
    {
        static void Main()

        {
            PartTimeEmployee PTE = new PartTimeEmployee();
            PTE.FirstName = "Part Time";
            PTE.LastName = " Employee";
            PTE.printFullName();

            FulltimeEmployee FTE = new FulltimeEmployee();
            FTE.FirstName = "Full Time";
            FTE.LastName = " Employee";
            FTE.printFullName();
            Console.ReadKey();
        }
    }

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

using System;

public class Employee
{
    public string FirstName;
    public string LastName;
    public void printFullName()
    {
       
        Console.WriteLine(FirstName + " " + LastName);
    }
}
public class PartTimeEmployee:Employee
{
    public new void printFullName()
    {
       
        Console.WriteLine(FirstName + " " + LastName+" Part Time Man");
    }
}
public class FulltimeEmployee:Employee
{

}

    class Program
    {
        static void Main()

        {
            Employee e = new Employee();
            e.FirstName = "Base";
            e.LastName = "Class";
            e.printFullName();
            PartTimeEmployee PTE = new PartTimeEmployee();
            PTE.FirstName = "Part Time";
            PTE.LastName = " Employee";
            PTE.printFullName();

            FulltimeEmployee FTE = new FulltimeEmployee();
            FTE.FirstName = "Full Time";
            FTE.LastName = " Employee";
            FTE.printFullName();
            Console.ReadKey();
        }
    }

আরো একভাবে , করতে পারবে ------------------------সেটা হলো ,

using System;

public class Employee
{
    public string FirstName;
    public string LastName;
    public void printFullName()
    {
       
        Console.WriteLine(FirstName + " " + LastName);
    }
}
public class PartTimeEmployee:Employee
{
    public new void printFullName()
    {
        base.printFullName();
        Console.WriteLine(FirstName + " " + LastName+" Part Time Man");
    }
}
public class FulltimeEmployee:Employee
{

}

    class Program
    {
        static void Main()

        {
          
            PartTimeEmployee PTE = new PartTimeEmployee();
            PTE.FirstName = "Part Time";
            PTE.LastName = " Employee";
            PTE.printFullName();

            FulltimeEmployee FTE = new FulltimeEmployee();
            FTE.FirstName = "Full Time";
            FTE.LastName = " Employee";
            FTE.printFullName();
            Console.ReadKey();
        }
    }

 তাহলে , আমরা বুঝতে পারছি  base কিওয়ারড ইউজ করে হিডেন বেইস ক্লাস মেম্বার কাজ করাতে পারছি ।।তো চলো , টাইপ ক্যাস্টিং এর মাধ্যমে কিভাবে করতে হয় ? দেখে আসি ------------

using System;

public class Employee
{
    public string FirstName;
    public string LastName;
    public void printFullName()
    {
       
        Console.WriteLine(FirstName + " " + LastName);
    }
}
public class PartTimeEmployee:Employee
{
    public new void printFullName()
    {
       
        Console.WriteLine(FirstName + " " + LastName+" Part Time Man");
    }
}
public class FulltimeEmployee:Employee
{

}

    class Program
    {
        static void Main()

        {
          
            PartTimeEmployee PTE = new PartTimeEmployee();
            PTE.FirstName = "Part Time";
            PTE.LastName = " Employee";
            ((Employee)PTE).printFullName();

            FulltimeEmployee FTE = new FulltimeEmployee();
            FTE.FirstName = "Full Time";
            FTE.LastName = " Employee";
            FTE.printFullName();
            Console.ReadKey();
        }
    }

PartTimeEmployee PTE = new PartTimeEmployee(); এর মাধ্যমে PartTimeEmployee নামক যে ক্লাস বানিয়েছিলাম তার অবজেক্ট ক্রিয়েট করেছি ।। তারপরে , ((Employee)PTE) এর মাধ্যমে আমরা PartTimeEmployee ক্লাসের অবজেক্ট কে Employee নামক প্যারেন্ট ক্লাসে কনভার্ট রে নিলাম ।। এর মানে , এখন আমায় সেই হিডেন মেথোডই শো করাবে ।। তুমি কি ভাবতে পেরেছো , তোমায় আমি আবারো বোকা বানালাম , চিন্তা করো তো কিভাবে ??


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

            Employee e = new Employee();
            e.FirstName = "Base";
            e.LastName = "Class";
            e.printFullName();

তোমরা যেনো , আবার ভুল করে এরকম ((PartTimeEmployee)PTE).printFullName(); না করে বসো , তাহলে কিন্তু হবে না ।। তুমি শুধু , চাইল্ড ক্লাসের অব্জেক্ট'কে প্যারেন্ট ক্লাসে টাইপ কাস্ট করতে পারবা , উল্টা'টা  করতে পারবা না ।।

আরো একটা সুন্দর ওয়ে আছে , হিডেন প্যারেন্ট ক্লাসের মেথোডকে শো করাতে , চলো দেখে আসি --


using System;

public class Employee
{
    public string FirstName;
    public string LastName;
    public void printFullName()
    {
       
        Console.WriteLine(FirstName + " " + LastName);
    }
}
public class PartTimeEmployee:Employee
{
    public new void printFullName()
    {
       
        Console.WriteLine(FirstName + " " + LastName+" Part Time Man");
    }
}
public class FulltimeEmployee:Employee
{

}

    class Program
    {
        static void Main()

        {
          
            Employee PTE = new PartTimeEmployee();
            PTE.FirstName = "Part Time";
            PTE.LastName = " Employee";
            PTE.printFullName();

            FulltimeEmployee FTE = new FulltimeEmployee();
            FTE.FirstName = "Full Time";
            FTE.LastName = " Employee";
            FTE.printFullName();
            Console.ReadKey();
        }
    }

রান করে দেখো , কি হয় ??? আশা করি বুঝতে পেরেছো , কি হলো ???? চলো , কি হলো বিষয়টা একটু খতিয়ে দেখি -----------

                          Employee PTE = new PartTimeEmployee();

 এর মাধ্যমে , আসলে   কি   হলো   ??   আমরা   Employee   প্যারেন্ট   ক্লাসের   নামে   যে   ( রেফারেন্স ) ভ্যারিয়েবল PTE ডিক্লেয়ার করলাম ,তার সাথে PartTimeEmployee নামক চাইল্ড ক্লাসের অবজেক্ট'টা  অ্যাসাইন করলাম ।। ঘুরেফিরে আমরা সেই একই কাজ করলাম ।।

এখন একটা গুরুত্বপূর্ণ  কথায় আসি , সেটা হলো - তোমাদের কি মনে হয় না যে ---

Employee PTE = new PartTimeEmployee();জিনিসটাকে এইভাবে না লিখে , একটু  PartTimeEmployee PTE = new Employee(); এইভাবে লিখি ।।হুম , মনে হতেই পারে ।।

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



































No comments:

Post a Comment