আজকে আমরা , মেথড হাইডিং নিয়ে কথা বলবো ।। এটা কিভাবে , করতে হয় ?? এর প্রয়োজনীয়'তা কি ?? এসব বিষয় নিয়ে ।।তার আগে , চলো আমরা - ইনহেরিটেন্স নিয়ে যে কথা বলেছিলাম , তারই নরমাল ছোট একটি উদাহরণ দেখে আসি --------------------------------
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(); এইভাবে লিখি ।।হুম , মনে হতেই পারে ।।
কিন্তু , একটা জিনিস সবসময় মাথায় রাখা উচিত যে - প্যারেন্ট ক্লাস চাইল্ড ক্লাসের উপর ডিপেন্ডেবল নয় , কিন্তু চাইল্ড ক্লাস প্যারেন্ট ক্লাসের উপর ডিপেন্ডেবল । তাই , তুমি শুধু কেবলমাত্র চাইল্ড ক্লাসের অবজেক্টকে প্যারেন্ট ক্লাসের রেফারেন্স ভ্যারিয়েবল এর সাথে অ্যাসাইন করাতে পারবা , এর উলটা কাজ করাতে পারবা না ।। আজ এইটুকুই থাক -----------------------
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