TypeScript হলো একটি শক্তিশালী এবং টাইপ-সিস্টেম ভিত্তিক ভাষা, যা JavaScript এর উপরে তৈরি হয়েছে এবং JavaScript এর সমস্ত সুবিধা সাপোর্ট করে। TypeScript এর সবচেয়ে বড় শক্তি হলো তার স্ট্রং টাইপিং এবং অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) সাপোর্ট, যা ডেভেলপারদের আরও সংগঠিত এবং ভুল মুক্ত কোড লেখার সুযোগ দেয়।
TypeScript এ OOP কনসেপ্টগুলোর জন্য সকল মৌলিক ফিচারগুলো পাওয়া যায় যেমন: ক্লাস (Class), ইনহেরিটেন্স (Inheritance), ইনটারফেস (Interface), এনক্যাপসুলেশন (Encapsulation), এবং পলিমরফিজম (Polymorphism)। নিচে TypeScript এ OOP ধারণাগুলোর ব্যাখ্যা এবং ব্যবহার দেখানো হয়েছে।
১. ক্লাস (Class)
TypeScript এ, ক্লাস হলো একটি ব্লুপ্রিন্ট যা অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়। ক্লাসের মাধ্যমে আপনি অবজেক্টের প্রোপার্টি এবং মেথড গুলি ডিফাইন করতে পারেন।
উদাহরণ:
class Person {
// প্রোপার্টি
name: string;
age: number;
// কন্সট্রাক্টর
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// মেথড
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
// অবজেক্ট তৈরি
const person1 = new Person("John", 30);
person1.greet(); // Output: Hello, my name is John and I am 30 years old.
এখানে, Person ক্লাসে দুটি প্রোপার্টি (name এবং age) এবং একটি মেথড (greet) রয়েছে। ক্লাসের কন্সট্রাক্টর মাধ্যমে আপনি অবজেক্ট ইনিশিয়ালাইজ করতে পারেন।
২. ইনহেরিটেন্স (Inheritance)
TypeScript এ ইনহেরিটেন্স এর মাধ্যমে আপনি এক ক্লাসের বৈশিষ্ট্য এবং আচরণ অন্য ক্লাসে উত্তরাধিকার হিসেবে পেতে পারেন। এর মাধ্যমে কোডের পুনরাবৃত্তি কমে এবং সহজে এক্সটেনশন সম্ভব হয়।
উদাহরণ:
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound() {
console.log("Some sound...");
}
}
class Dog extends Animal {
constructor(name: string) {
super(name); // সুপার ক্লাসের কন্সট্রাক্টর কল করা
}
makeSound() {
console.log("Bark!");
}
}
const dog1 = new Dog("Buddy");
dog1.makeSound(); // Output: Bark!
এখানে, Dog ক্লাস Animal ক্লাস থেকে ইনহেরিট করেছে। Dog ক্লাসে makeSound মেথডটি ওভাররাইড (override) করা হয়েছে, যাতে এটি "Bark!" আউটপুট দেয়।
৩. ইনটারফেস (Interface)
ইনটারফেস হলো একটি চুক্তি যা ক্লাস বা অবজেক্টের জন্য ডেটা শেপ (structure) নির্ধারণ করে। TypeScript এ এটি কোডে আরও সুরক্ষা এবং ডেভেলপারদের জন্য সাহায্যকারী হয়।
উদাহরণ:
interface Animal {
name: string;
makeSound(): void;
}
class Cat implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound() {
console.log("Meow!");
}
}
const cat1 = new Cat("Whiskers");
cat1.makeSound(); // Output: Meow!
এখানে Animal ইনটারফেসটি name প্রোপার্টি এবং makeSound মেথডটি ডিফাইন করেছে। Cat ক্লাসটি এই ইনটারফেস ইমপ্লিমেন্ট (implement) করেছে, এবং এর মাধ্যমে Cat ক্লাসের প্রোপার্টি ও মেথড নিশ্চিত করা হয়েছে।
৪. এনক্যাপসুলেশন (Encapsulation)
এনক্যাপসুলেশন হল ডেটা হাইডিং বা ডেটাকে ক্লাসের ভিতরে সীমাবদ্ধ করা, যাতে বাহ্যিক কোড সরাসরি ডেটাকে অ্যাক্সেস করতে না পারে। TypeScript এ এটি private, protected, এবং public অ্যাক্সেস মডিফায়ারের মাধ্যমে করা হয়।
উদাহরণ:
class Employee {
private id: number;
public name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
// পাবলিক মেথড
getId() {
return this.id;
}
}
const emp = new Employee(1, "Alice");
console.log(emp.name); // Output: Alice
console.log(emp.getId()); // Output: 1
console.log(emp.id); // Error: Property 'id' is private and only accessible within class 'Employee'.
এখানে, id প্রোপার্টি private, যার মানে এটি কেবলমাত্র ক্লাসের ভিতরেই অ্যাক্সেসযোগ্য। getId() মেথডটি পাবলিক এবং এর মাধ্যমে আমরা id প্রোপার্টি অ্যাক্সেস করতে পারি।
৫. পলিমরফিজম (Polymorphism)
পলিমরফিজম এর মাধ্যমে একাধিক ক্লাসের মেথড একই নাম ও আচরণে কাজ করতে পারে, কিন্তু তাদের বাস্তবায়ন (implementation) ভিন্ন হতে পারে। TypeScript এ এটি ইনহেরিটেন্স এবং মেথড ওভাররাইডের মাধ্যমে অর্জন করা যায়।
উদাহরণ:
class Shape {
area(): void {
console.log("Area of the shape.");
}
}
class Circle extends Shape {
area(): void {
console.log("Area of the circle.");
}
}
class Square extends Shape {
area(): void {
console.log("Area of the square.");
}
}
const shape1: Shape = new Circle();
shape1.area(); // Output: Area of the circle.
const shape2: Shape = new Square();
shape2.area(); // Output: Area of the square.
এখানে, Shape ক্লাসের area মেথডটি পলিমরফিকভাবে Circle এবং Square ক্লাসে ওভাররাইড করা হয়েছে।
উপসংহার
TypeScript-এ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) কনসেপ্টগুলো বাস্তবায়ন করা সহজ এবং শক্তিশালী। ক্লাস, ইনহেরিটেন্স, ইনটারফেস, এনক্যাপসুলেশন, এবং পলিমরফিজম সব TypeScript এর শক্তিশালী ফিচার, যা আপনাকে আরও স্কেলেবল এবং মেন্টেইনেবল অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে। TypeScript এর টাইপ সিস্টেম এই OOP ধারণাগুলো আরও কার্যকর এবং নিরাপদভাবে ব্যবহার করতে সহায়তা করে।
TypeScript একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষা, যা ক্লাস এবং অবজেক্ট ব্যবহার করে কোড সংগঠিত করার সুবিধা দেয়। TypeScript এর ক্লাস গুলি JavaScript এর ক্লাসের মতই কাজ করে, তবে এতে স্ট্রিক্ট টাইপিং এবং আরও কিছু অতিরিক্ত সুবিধা পাওয়া যায়।
এই গাইডে TypeScript ক্লাস এবং অবজেক্টের ধারণা, কীভাবে ক্লাস তৈরি করতে হয়, এবং ক্লাসের মধ্যকার বিভিন্ন কনসেপ্ট যেমন ইনহেরিটেন্স, মেথড, প্রপার্টি ইত্যাদি কভার করা হবে।
১. ক্লাস তৈরি করা
TypeScript এ ক্লাস তৈরি করা JavaScript এর মতোই, তবে TypeScript আপনাকে টাইপ ডেফিনিশন এবং আরও কিছু উন্নত ফিচার সরবরাহ করে। একটি সাধারণ ক্লাসের উদাহরণ নিচে দেওয়া হলো:
class Person {
// প্রপার্টি ডিফাইনেশন
name: string;
age: number;
// কনস্ট্রাক্টর
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// মেথড
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
এখানে:
nameএবংageহলো ক্লাসের প্রপার্টি।constructor()হলো একটি বিশেষ মেথড যা ক্লাসের অবজেক্ট তৈরি করার সময় ডাকা হয়।greet()হলো একটি সাধারণ মেথড যা ক্লাসের অবজেক্টের মাধ্যমে কল করা যায়।
২. ক্লাসের অবজেক্ট তৈরি করা
একবার ক্লাস তৈরি হয়ে গেলে, আপনি তার একটি অবজেক্ট তৈরি করতে পারবেন। নিচে একটি উদাহরণ দেওয়া হলো:
// Person ক্লাসের অবজেক্ট তৈরি করা
let person1 = new Person("John", 25);
// মেথড কল করা
person1.greet(); // Output: Hello, my name is John and I am 25 years old.
এখানে, person1 হলো Person ক্লাসের একটি অবজেক্ট, যা কনস্ট্রাক্টরের মাধ্যমে name এবং age প্রপার্টি ইনিশিয়ালাইজ করেছে।
৩. ইনহেরিটেন্স (Inheritance)
TypeScript ক্লাস ইনহেরিটেন্সও সাপোর্ট করে, অর্থাৎ আপনি একটি ক্লাসকে অন্য একটি ক্লাস থেকে উত্তরাধিকার (inherit) করতে পারেন। এর মাধ্যমে আপনি কোডের পুনরাবৃত্তি এড়াতে পারেন এবং নতুন ক্লাসে পুরোনো ক্লাসের বৈশিষ্ট্যগুলো ব্যবহার করতে পারেন।
class Employee extends Person {
jobTitle: string;
constructor(name: string, age: number, jobTitle: string) {
super(name, age); // Parent class (Person) constructor কল
this.jobTitle = jobTitle;
}
// নতুন মেথড
showJobTitle() {
console.log(`I am a ${this.jobTitle}.`);
}
}
// Employee ক্লাসের অবজেক্ট তৈরি
let employee1 = new Employee("Jane", 30, "Software Developer");
employee1.greet(); // Output: Hello, my name is Jane and I am 30 years old.
employee1.showJobTitle(); // Output: I am a Software Developer.
এখানে:
Employeeক্লাসPersonক্লাস থেকে ইনহেরিট করেছে।super()মেথড ব্যবহার করে প্যারেন্ট ক্লাসের কনস্ট্রাক্টর কল করা হয়েছে।
৪. অবজেক্ট টাইপ
TypeScript এ ক্লাসের অবজেক্টের টাইপ ডিফাইন করা যায়। এটি কোডের টাইপ সেফটি নিশ্চিত করে এবং অবজেক্টের প্রপার্টি সম্পর্কে টাইপ সম্পর্কিত ত্রুটি চেক করতে সাহায্য করে।
let person2: Person = new Person("Alice", 28);
person2.greet();
এখানে person2 টাইপ Person হিসেবে ডিফাইন করা হয়েছে, অর্থাৎ এটি Person ক্লাসের একটি অবজেক্ট হতে হবে।
৫. অ্যাবস্ট্রাক্ট ক্লাস (Abstract Classes)
TypeScript এ অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করা হয় যখন আপনি একটি বেস ক্লাস তৈরি করতে চান যা সরাসরি ইনস্ট্যানশিয়েট (instantiate) করা যাবে না, কিন্তু তার সাবক্লাসগুলিতে বাস্তবায়ন (implementation) থাকবে।
abstract class Animal {
abstract makeSound(): void; // অ্যাবস্ট্রাক্ট মেথড
move() {
console.log("This animal moves");
}
}
class Dog extends Animal {
makeSound() {
console.log("Woof");
}
}
let dog = new Dog();
dog.makeSound(); // Output: Woof
dog.move(); // Output: This animal moves
এখানে:
Animalক্লাস একটি অ্যাবস্ট্রাক্ট ক্লাস, এবংmakeSound()মেথডটিকে অ্যাবস্ট্রাক্ট হিসেবে ডিফাইন করা হয়েছে, যার অর্থDogক্লাসে এটিকে বাস্তবায়ন (implement) করতে হবে।
৬. সারাংশ
TypeScript ক্লাস এবং অবজেক্ট ব্যবহারের মাধ্যমে আপনি অ্যাবস্ট্রাকশন, ইনহেরিটেন্স, এবং অন্যান্য OOP কনসেপ্টগুলো কাজে লাগিয়ে আরও সংগঠিত এবং রিডেবল কোড লিখতে পারেন। TypeScript এর স্ট্রিক্ট টাইপ সিস্টেম এই কাজটিকে আরও সহজ এবং নিরাপদ করে তোলে।
- ক্লাসের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
- ইনহেরিটেন্সের মাধ্যমে একাধিক ক্লাসের মধ্যে বৈশিষ্ট্য শেয়ার করা যায়।
- অ্যাবস্ট্রাক্ট ক্লাসের মাধ্যমে নির্দিষ্ট ধরনের কনট্রোল এবং ডেভেলপারদের জন্য নির্দেশনা প্রদান করা হয়।
TypeScript ক্লাস এবং অবজেক্টের সাহায্যে আপনি জাভাস্ক্রিপ্ট কোডের বেশি গঠনমূলক এবং দক্ষ প্রকল্প তৈরি করতে পারবেন।
TypeScript এ ইনহেরিটেন্স (inheritance) এর মাধ্যমে একটি ক্লাস অন্য ক্লাসের বৈশিষ্ট্য এবং মেথড গ্রহণ করতে পারে। এটি object-oriented programming (OOP) এর একটি মৌলিক ধারণা যা কোড পুনরায় ব্যবহারযোগ্য এবং একাধিক ক্লাসের মধ্যে সম্পর্ক তৈরি করে।
TypeScript এ ইনহেরিটেন্সে extends কীওয়ার্ড ব্যবহার করা হয়। এটি ব্যবহার করে আপনি একটি ক্লাসের সমস্ত বৈশিষ্ট্য (properties) এবং পদ্ধতি (methods) অন্য একটি ক্লাসে উত্তরাধিকার (inherit) করতে পারেন।
১. ক্লাস এবং ইনহেরিটেন্সের ধারণা
একটি ক্লাসের বৈশিষ্ট্য এবং মেথডকে অন্য একটি ক্লাসে উত্তরাধিকারী করে নিতে, আপনি extends কীওয়ার্ড ব্যবহার করতে পারেন।
উদাহরণ:
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound(): void {
console.log(`${this.name} makes a sound.`);
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name); // Animal ক্লাসের constructor কল করা হচ্ছে
this.breed = breed;
}
bark(): void {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog("Buddy", "Golden Retriever");
dog.makeSound(); // Animal ক্লাসের মেথড
dog.bark(); // Dog ক্লাসের মেথড
এখানে:
Dogক্লাসটিAnimalক্লাস থেকে ইনহেরিট করেছে, অর্থাৎDogক্লাসAnimalক্লাসের সমস্ত বৈশিষ্ট্য এবং মেথড গ্রহণ করেছে।super()ব্যবহার করে প্যারেন্ট ক্লাস (এখানেAnimal) এর কনস্ট্রাক্টর কল করা হয়েছে।Dogক্লাসে নতুন একটি মেথডbark()যোগ করা হয়েছে যাAnimalক্লাসে নেই।
২. super() কীওয়ার্ড
super() কীওয়ার্ডটি প্যারেন্ট ক্লাসের কনস্ট্রাক্টর এবং মেথডকে কল করার জন্য ব্যবহৃত হয়। যখন একটি ক্লাস অন্য ক্লাসকে extends করে, তখন প্যারেন্ট ক্লাসের কনস্ট্রাক্টরকে কল করার জন্য super() ব্যবহার করা হয়।
উদাহরণ:
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
greet(): void {
console.log(`Hello, ${this.name}`);
}
}
class Employee extends Person {
position: string;
constructor(name: string, position: string) {
super(name); // Person ক্লাসের কনস্ট্রাক্টর কল
this.position = position;
}
work(): void {
console.log(`${this.name} is working as a ${this.position}.`);
}
}
const employee = new Employee("John", "Developer");
employee.greet(); // Person ক্লাসের মেথড
employee.work(); // Employee ক্লাসের মেথড
এখানে:
Employeeক্লাসPersonক্লাস থেকে ইনহেরিট করেছে।super(name)ব্যবহার করেPersonক্লাসের কনস্ট্রাক্টর কল করা হয়েছে।
৩. সুপার ক্লাসের মেথড এবং প্রপার্টি অ্যাক্সেস
ইনহেরিটেন্স ব্যবহারের সময়, আপনি প্যারেন্ট ক্লাসের মেথড এবং প্রপার্টি সিবলিং ক্লাসে অ্যাক্সেস করতে পারেন। তবে, কখনও কখনও আপনি প্যারেন্ট ক্লাসের মেথড বা প্রপার্টি মডিফাই করতে চাইলে super কীওয়ার্ড ব্যবহার করতে পারেন।
উদাহরণ:
class Car {
brand: string;
constructor(brand: string) {
this.brand = brand;
}
drive(): void {
console.log(`${this.brand} car is driving.`);
}
}
class ElectricCar extends Car {
batteryLife: number;
constructor(brand: string, batteryLife: number) {
super(brand); // Car ক্লাসের কনস্ট্রাক্টর কল
this.batteryLife = batteryLife;
}
drive(): void {
console.log(`${this.brand} electric car is driving silently.`);
}
checkBattery(): void {
console.log(`Battery life: ${this.batteryLife} hours.`);
}
}
const tesla = new ElectricCar("Tesla", 12);
tesla.drive(); // ElectricCar ক্লাসের মেথড
tesla.checkBattery(); // ElectricCar ক্লাসের নতুন মেথড
এখানে:
ElectricCarক্লাসটিCarক্লাস থেকে ইনহেরিট করেছে।ElectricCarক্লাসেরdrive()মেথডCarক্লাসেরdrive()মেথডকে ওভাররাইড করেছে (Method Overriding)।checkBattery()একটি নতুন মেথড যাElectricCarক্লাসে যোগ করা হয়েছে।
৪. মেথড ওভাররাইডিং (Method Overriding)
TypeScript এ আপনি প্যারেন্ট ক্লাসের মেথডকে কনটেক্সটের ভিত্তিতে কাস্টমাইজ করতে পারেন। এটি মেথড ওভাররাইডিং বলে পরিচিত।
উদাহরণ:
class Animal {
sound(): void {
console.log("Some generic animal sound");
}
}
class Cat extends Animal {
sound(): void {
console.log("Meow");
}
}
const cat = new Cat();
cat.sound(); // "Meow"
এখানে, Cat ক্লাসে sound() মেথডটি Animal ক্লাসের sound() মেথডকে ওভাররাইড করেছে।
৫. মাল্টিপল ইনহেরিটেন্স (Multiple Inheritance)
TypeScript সরাসরি মাল্টিপল ইনহেরিটেন্স সমর্থন করে না (যেখানে একাধিক ক্লাস একসাথে ইনহেরিট করতে পারে)। তবে আপনি ইন্টারফেস ব্যবহার করে একাধিক ইনহেরিটেন্স সিমুলেট করতে পারেন।
উদাহরণ:
interface Flyer {
fly(): void;
}
interface Swimmer {
swim(): void;
}
class Duck implements Flyer, Swimmer {
fly(): void {
console.log("Duck is flying");
}
swim(): void {
console.log("Duck is swimming");
}
}
const duck = new Duck();
duck.fly(); // Duck is flying
duck.swim(); // Duck is swimming
এখানে, Duck ক্লাস দুটি ইন্টারফেস Flyer এবং Swimmer কে ইমপ্লিমেন্ট করেছে, যা মাল্টিপল ইনহেরিটেন্সের মতো কাজ করছে।
সারাংশ
extendsকীওয়ার্ড ব্যবহার করে একটি ক্লাস অন্য একটি ক্লাস থেকে ইনহেরিট করতে পারে।super()প্যারেন্ট ক্লাসের কনস্ট্রাক্টর বা মেথড কল করতে ব্যবহৃত হয়।- মেথড ওভাররাইডিং এবং ইন্টারফেস TypeScript এ ইনহেরিটেন্সের শক্তিশালী ফিচার।
TypeScript এ এক্সেস মডিফায়ারস (Access Modifiers) ব্যবহৃত হয় ক্লাসের প্রপার্টি এবং মেথডের দৃশ্যমানতা এবং অ্যাক্সেস নিয়ন্ত্রণ করতে। এগুলি তিনটি ধরণের হতে পারে: public, private, এবং protected। এগুলির সাহায্যে আপনি কোডের encapsulation এবং তথ্য গোপনীয়তা বজায় রাখতে পারেন।
এক্সেস মডিফায়ারস কী?
এক্সেস মডিফায়ারস একটি ক্লাসের সদস্যগুলোর (যেমন প্রপার্টি বা মেথড) অ্যাক্সেস কন্ট্রোল করতে ব্যবহৃত হয়। TypeScript এ তিনটি প্রধান এক্সেস মডিফায়ার রয়েছে:
publicprivateprotected
প্রত্যেকটি এক্সেস মডিফায়ার ক্লাসের সদস্যগুলির দৃশ্যমানতা এবং অ্যাক্সেসের সীমা নির্ধারণ করে।
১. public এক্সেস মডিফায়ার
publicহল ডিফল্ট এক্সেস মডিফায়ার। যদি কোনো সদস্যের জন্য এক্সেস মডিফায়ার নির্ধারণ না করা হয়, তবে এটি স্বয়ংক্রিয়ভাবেpublicধরা হয়।publicসদস্যগুলি ক্লাসের বাইরেও অ্যাক্সেসযোগ্য থাকে।
উদাহরণ:
class Person {
public name: string;
public age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
const person = new Person("John", 30);
console.log(person.name); // Accessible outside the class
person.greet(); // Accessible outside the class
এখানে name, age, এবং greet() মেথড সবই public, তাই এগুলো ক্লাসের বাইরেও অ্যাক্সেস করা যেতে পারে।
২. private এক্সেস মডিফায়ার
privateসদস্যগুলি শুধুমাত্র ক্লাসের ভিতরে অ্যাক্সেসযোগ্য থাকে। এগুলো ক্লাসের বাইরের কোড থেকে অ্যাক্সেস করা যায় না।- এটি ক্লাসের সদস্যকে ইনক্যাপসুলেটেড রাখে, যাতে অন্য কেউ সরাসরি সেই সদস্যের মান পরিবর্তন করতে না পারে।
উদাহরণ:
class Person {
private name: string;
private age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public getDetails() {
return `${this.name} is ${this.age} years old.`;
}
}
const person = new Person("John", 30);
console.log(person.getDetails()); // Allowed
// console.log(person.name); // Error: 'name' is private and only accessible within class 'Person'
এখানে, name এবং age প্রপার্টি private, তাই এগুলো ক্লাসের বাইরে থেকে অ্যাক্সেস বা পরিবর্তন করা যাবে না। তবে, getDetails() মেথডটি public থাকায়, এটি বাইরের কোড থেকে অ্যাক্সেস করা যাবে।
৩. protected এক্সেস মডিফায়ার
protectedসদস্যগুলি ক্লাসের ভিতর এবং এর কোনো সাবক্লাস থেকে অ্যাক্সেসযোগ্য থাকে, কিন্তু বাইরের কোড থেকে অ্যাক্সেস করা যায় না।- এটি একটি ক্লাসের ইনহেরিটেন্স ব্যবহারের সময় সাবক্লাসে প্রপার্টি বা মেথড শেয়ার করতে সাহায্য করে।
উদাহরণ:
class Animal {
protected name: string;
constructor(name: string) {
this.name = name;
}
protected speak() {
console.log(`${this.name} makes a sound`);
}
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
public bark() {
this.speak(); // Allowed: speak() is protected and can be accessed in subclass
console.log(`${this.name} barks`);
}
}
const dog = new Dog("Buddy");
dog.bark(); // Allowed
// dog.speak(); // Error: 'speak' is protected and only accessible within class 'Animal' and its subclasses
এখানে, name এবং speak() সদস্যগুলি protected, তাই এগুলি Animal ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা যাবে না, তবে Dog ক্লাসে এগুলির অ্যাক্সেস রয়েছে, যেহেতু এটি Animal ক্লাস থেকে ইনহেরিট করেছে।
এক্সেস মডিফায়ারসের ব্যবহারের সুবিধা
- Encapsulation (এনক্যাপসুলেশন): এক্সেস মডিফায়ারস আপনাকে ক্লাসের অভ্যন্তরীণ তথ্য গোপন রাখতে সহায়তা করে এবং শুধুমাত্র দরকারি তথ্য বাইরে এক্সপোজ করে। এটি কোডের নিরাপত্তা ও স্থায়ীত্ব নিশ্চিত করে।
- প্রতি-সীমিত অ্যাক্সেস:
privateএবংprotectedএক্সেস মডিফায়ারসের মাধ্যমে আপনি ক্লাসের সদস্যদের সঠিকভাবে নিয়ন্ত্রণ করতে পারেন, যাতে অন্য কোনো কোড তাদের অবৈধভাবে অ্যাক্সেস বা পরিবর্তন করতে না পারে। - ইনহেরিটেন্স ব্যবস্থাপনা:
protectedমেম্বারগুলো সাবক্লাসে অ্যাক্সেসযোগ্য হওয়ায় ইনহেরিটেন্সে কোড রিইউজ করার সুবিধা পাওয়া যায়।
সারাংশ
public: কোনো বাধা ছাড়াই ক্লাসের বাইরের কোড থেকেও অ্যাক্সেসযোগ্য।private: শুধুমাত্র ক্লাসের ভিতর থেকেই অ্যাক্সেসযোগ্য, বাইরের কোড বা সাবক্লাসে অ্যাক্সেস সম্ভব নয়।protected: ক্লাসের ভিতর এবং এর সাবক্লাস থেকে অ্যাক্সেসযোগ্য, কিন্তু বাইরের কোড থেকে অ্যাক্সেস সম্ভব নয়।
এক্সেস মডিফায়ারস TypeScript কোডে নিরাপত্তা, রক্ষণাবেক্ষণ এবং এনক্যাপসুলেশন নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে।
TypeScript-এ অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেস দুটি গুরুত্বপূর্ণ কনসেপ্ট। এগুলোর সাহায্যে আপনি আরও শক্তিশালী, পুনঃব্যবহারযোগ্য এবং নির্ভরযোগ্য কোড লিখতে পারেন।
১. অ্যাবস্ট্রাক্ট ক্লাস (Abstract Class)
অ্যাবস্ট্রাক্ট ক্লাস হলো এমন একটি ক্লাস যেটি সরাসরি ইনস্ট্যান্স তৈরি করতে পারে না, তবে এটি অন্যান্য ক্লাস দ্বারা এক্সটেন্ড করা যেতে পারে। অ্যাবস্ট্রাক্ট ক্লাসে সাধারণত অ্যাবস্ট্রাক্ট মেথড থাকে, যেগুলো সাব-ক্লাসে অবশ্যই ইমপ্লিমেন্ট করতে হয়।
অ্যাবস্ট্রাক্ট ক্লাসের ব্যবহার
অ্যাবস্ট্রাক্ট ক্লাস তৈরির জন্য abstract কিওয়ার্ড ব্যবহার করা হয়।
উদাহরণ:
abstract class Animal {
abstract sound(): void; // অ্যাবস্ট্রাক্ট মেথড
move(): void {
console.log("The animal moves");
}
}
class Dog extends Animal {
sound(): void {
console.log("Bark");
}
}
const dog = new Dog();
dog.sound(); // Output: Bark
dog.move(); // Output: The animal moves
এখানে, Animal ক্লাসটি একটি অ্যাবস্ট্রাক্ট ক্লাস যা sound() নামক একটি অ্যাবস্ট্রাক্ট মেথড ডিক্লেয়ার করেছে। Dog ক্লাসটি Animal থেকে এক্সটেন্ড করে এবং sound() মেথড ইমপ্লিমেন্ট করেছে।
অ্যাবস্ট্রাক্ট ক্লাসের সুবিধা:
- একাধিক ক্লাসের মধ্যে সাধারণ বৈশিষ্ট্য বা ফাংশনালিটি ভাগ করা যায়।
- ইন্টারফেসের তুলনায় অ্যাবস্ট্রাক্ট ক্লাসে কিছু সাধারণ কোডও থাকতে পারে, যা ইন্টারফেসে সম্ভব নয়।
নোট:
- অ্যাবস্ট্রাক্ট ক্লাসের অবজেক্ট সরাসরি তৈরি করা যায় না।
- শুধুমাত্র ক্লাস এক্সটেন্ড করার পরেই অ্যাবস্ট্রাক্ট মেথডের ইমপ্লিমেন্টেশন দেওয়া হয়।
২. ইন্টারফেস (Interface)
ইন্টারফেস TypeScript-এ একটি চুক্তি (contract) যা নিশ্চিত করে যে একটি ক্লাস বা অবজেক্ট নির্দিষ্ট কিছু মেথড বা প্রপার্টি থাকতে হবে। ইন্টারফেস ব্যবহার করে আপনি কোডের মধ্যে টাইপ সেফটি নিশ্চিত করতে পারেন।
ইন্টারফেসের ব্যবহার
ইন্টারফেসে শুধুমাত্র মেথড সিগনেচার (method signatures) এবং প্রপার্টি ডিক্লেয়ার করা হয়, কিন্তু কোন বাস্তবায়ন থাকে না। একটি ক্লাস যখন ইন্টারফেস ইমপ্লিমেন্ট করে, তখন তাকে ইন্টারফেসে ডিফাইন করা সমস্ত মেথড এবং প্রপার্টি ইমপ্লিমেন্ট করতে হয়।
উদাহরণ:
interface Animal {
sound(): void;
move(): void;
}
class Dog implements Animal {
sound(): void {
console.log("Bark");
}
move(): void {
console.log("The dog runs");
}
}
const dog = new Dog();
dog.sound(); // Output: Bark
dog.move(); // Output: The dog runs
এখানে, Animal একটি ইন্টারফেস যা sound() এবং move() মেথড ডিফাইন করেছে। Dog ক্লাসটি এই ইন্টারফেসটি ইমপ্লিমেন্ট করেছে এবং প্রতিটি মেথডের বাস্তবায়ন প্রদান করেছে।
ইন্টারফেসের সুবিধা:
- ইন্টারফেস শুধুমাত্র চুক্তি নির্ধারণ করে, কোডের রিফ্যাক্টরিং সহজ করে।
- একাধিক ক্লাসে একই ইন্টারফেস ব্যবহার করে কোডের পুনঃব্যবহারযোগ্যতা বাড়ানো যায়।
- একাধিক ইন্টারফেস একসাথে ইমপ্লিমেন্ট করা সম্ভব, যা একাধিক উত্তরাধিকার (inheritance) প্রয়োগের মতো কাজ করে।
নোট:
- ইন্টারফেস শুধুমাত্র মেথড এবং প্রপার্টি সিগনেচার ডিফাইন করতে পারে, বাস্তবায়ন নয়।
- একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, কিন্তু শুধুমাত্র একটাই অ্যাবস্ট্রাক্ট ক্লাস এক্সটেন্ড করতে পারে।
৩. অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের মধ্যে পার্থক্য
| বৈশিষ্ট্য | অ্যাবস্ট্রাক্ট ক্লাস (Abstract Class) | ইন্টারফেস (Interface) |
|---|---|---|
| ব্যবহার | সাধারণ কোড ভাগ করতে, ক্লাসের মধ্যে কিছু বাস্তবায়ন দিতে | চুক্তি নির্ধারণ, মেথড/প্রপার্টি সংজ্ঞা |
| একাধিক উত্তরাধিকার | একটি ক্লাস কেবল একটাই অ্যাবস্ট্রাক্ট ক্লাস এক্সটেন্ড করতে পারে | একাধিক ইন্টারফেস ইমপ্লিমেন্ট করা যায় |
| কোড বাস্তবায়ন | অ্যাবস্ট্রাক্ট ক্লাসে কোড বাস্তবায়ন থাকতে পারে | ইন্টারফেসে কোড বাস্তবায়ন থাকে না |
| ডিফাইন করা মেথড | অ্যাবস্ট্রাক্ট মেথড এবং কনক্রিট মেথড থাকতে পারে | শুধুমাত্র মেথড সিগনেচার থাকতে পারে |
৪. অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেস ব্যবহার করার সময় বিবেচনা
- অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন: যখন আপনার কোডে কিছু সাধারণ লজিক (logic) থাকতে হবে যা একাধিক সাব-ক্লাসে ভাগ করা হবে।
- ইন্টারফেস ব্যবহার করুন: যখন আপনি চুক্তি তৈরি করতে চান যাতে একাধিক ক্লাস একই ধরনের মেথড বা প্রপার্টি ইমপ্লিমেন্ট করে।
TypeScript-এ অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেস উভয়ই শক্তিশালী কনসেপ্ট, এবং এগুলোর সঠিক ব্যবহারের মাধ্যমে আপনি আরও নির্ভরযোগ্য এবং পুনঃব্যবহারযোগ্য কোড লিখতে পারবেন।
Read more