আজকে আমরা অ্যাবস্ট্রাক্ট ক্লাস নিয়ে কিছু কথা বলবো , প্রথমেই বলে রাখি , এটার সাথে ইন্টারফেইস এর বেশ কিছু মিল আছে , তাই বুঝতে সুবিধা হবে , আবার অনেক অমিলও আছে ।।
ইন্টারফেইস এর জন্য আমরা কোনো অব্জেক্ট ক্রিয়েট করতে পারি না , বাট রেফারেন্স ভ্যারিয়েবল ক্রিয়েট করতে পারি ।। শুধু ক্লাসের জন্য তো অব্জেক্ট ক্রিয়েট , রেফারেন্স ভ্যারিয়েবল সবই ক্রিয়েট করতে পারি , অ্যাবস্ট্রাক্ট এর ক্ষেত্রে আমরা , এর কোনো অব্জেক্ট ক্রিয়েট করতে পারি না ।। তবে , ইন্টারফেইস এর মতোই এর রেফারেন্স ভ্যারিয়েবল ক্রিয়েট করতে পারি ----------------------
চলো সিম্পল দেখে আসি ----
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
{
}
অ্যাবস্ট্রাক্ট ক্লাস থেকে , ইন্টারফেইস ইনহেরিটেড করলে এরর খাবা ।।
আরো একটি বিষয় জেনে রাখা উচিত - একটা ক্লাস একাধিক ইন্টারফেইস থেকে ইনহেরিটেড হতে পারে , বাট একটা ক্লাস একাধিক অ্যাবস্ট্রাক্ট ক্লাস থেকে ইনহেরিটেড হতে পারে না ।।
যাই হোক , মোটামুটি অ্যাবস্ট্রাক্ট ক্লাস এর ফিয়েচার /সিন্ট্যাক্স নিয়ে কিছু বেসিক আলোচনা হলো , সামনে আরো ডিটেইলস আলোচনা করবো , আজ এইটুকুই --------------
ইন্টারফেইস এর জন্য আমরা কোনো অব্জেক্ট ক্রিয়েট করতে পারি না , বাট রেফারেন্স ভ্যারিয়েবল ক্রিয়েট করতে পারি ।। শুধু ক্লাসের জন্য তো অব্জেক্ট ক্রিয়েট , রেফারেন্স ভ্যারিয়েবল সবই ক্রিয়েট করতে পারি , অ্যাবস্ট্রাক্ট এর ক্ষেত্রে আমরা , এর কোনো অব্জেক্ট ক্রিয়েট করতে পারি না ।। তবে , ইন্টারফেইস এর মতোই এর রেফারেন্স ভ্যারিয়েবল ক্রিয়েট করতে পারি ----------------------
চলো সিম্পল দেখে আসি ----
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