আপনার প্রশ্নে আপনি যে কোড নমুনা দেখিয়েছেন তা উভয়ই প্রোটোটাইপাল উত্তরাধিকার ব্যবহার করে। প্রকৃতপক্ষে আপনি জাভাস্ক্রিপ্টে যে কোনও অবজেক্ট-ওরিয়েন্টেড কোড লিখেছেন তা প্রোটোটাইপাল উত্তরাধিকারের দৃষ্টান্ত। জাভাস্ক্রিপ্টের কেবল শাস্ত্রীয় উত্তরাধিকার নেই। এটি জিনিসগুলিকে কিছুটা পরিষ্কার করতে হবে:
Inheritance
|
+-----------------------------+
| |
v v
Prototypal Classical
|
+------------------------------+
| |
v v
Prototypal Pattern Constructor Pattern
আপনি দেখতে পারেন প্রোটোটাইপাল উত্তরাধিকার এবং শাস্ত্রীয় উত্তরাধিকার হ'ল উত্তরাধিকারের দুটি পৃথক দৃষ্টান্ত। কিছু ভাষা যেমন স্ব, লুয়া এবং জাভাস্ক্রিপ্ট প্রোটোটাইপাল উত্তরাধিকারকে সমর্থন করে। তবে বেশিরভাগ ভাষা যেমন সি ++, জাভা এবং সি # ধ্রুপদী উত্তরাধিকারকে সমর্থন করে।
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের একটি দ্রুত ওভারভিউ
প্রোটোটাইপাল উত্তরাধিকার এবং শাস্ত্রীয় উত্তরাধিকার উভয়ই অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং প্যারাডিজম (যেমন তারা বস্তুর সাথে লেনদেন করে)। অবজেক্টগুলি কেবল বিমূর্ততা যা সত্যিকারের বিশ্ব সত্তার বৈশিষ্ট্যগুলিকে আবদ্ধ করে (যেমন তারা প্রোগ্রামে সত্যিকারের শব্দগুলির প্রতিনিধিত্ব করে)। এটি বিমূর্ততা হিসাবে পরিচিত।
বিমূর্ততা: কম্পিউটার প্রোগ্রামগুলিতে বাস্তব বিশ্বের বিষয়গুলির প্রতিনিধিত্ব।
তাত্ত্বিকভাবে একটি বিমূর্ততা "নির্দিষ্ট উদাহরণগুলি থেকে সাধারণ বৈশিষ্ট্যগুলি বের করে একটি সাধারণ ধারণা" হিসাবে সংজ্ঞায়িত করা হয়। তবে এই ব্যাখ্যার খাতিরে আমরা এর পরিবর্তে পূর্বোক্ত সংজ্ঞাটি ব্যবহার করব।
এখন কিছু বস্তুর প্রচুর জিনিস প্রচলিত রয়েছে। উদাহরণস্বরূপ একটি মাটির বাইক এবং হারলে ডেভিডসনের মধ্যে প্রচুর মিল রয়েছে।
একটি মাটির বাইক:
একটি হারলে ডেভিডসন:
একটি মাটির বাইক এবং একটি হার্লি ডেভিডসন উভয় বাইক। সুতরাং বাইকটি একটি কাদামাটি বাইক এবং হারলে ডেভিডসন উভয়েরই সাধারণীকরণ।
Bike
|
+---------------------------------+
| |
v v
Mud Bike Harley Davidson
উপরের উদাহরণে বাইক, মাটির বাইক এবং হারলে ডেভিডসন সমস্ত বিমূর্ততা। তবে বাইকটি কাদা বাইকের আরও সাধারণ বিমূর্ততা এবং হারলে ডেভিডসন (অর্থাত্ মাটির বাইক এবং হারলে ডেভিডসন উভয়ই নির্দিষ্ট ধরণের বাইক)।
জেনারালাইজেশন: আরও নির্দিষ্ট বিমূর্ততার একটি বিমূর্ততা।
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে আমরা অবজেক্ট তৈরি করি (যা বাস্তব বিশ্বের সত্তার বিমূর্ততা) এবং আমরা এই বিষয়গুলির সাধারণীকরণ তৈরি করতে ক্লাস বা প্রোটোটাইপগুলি ব্যবহার করি। জেনারালাইজেশনগুলি উত্তরাধিকারের মাধ্যমে তৈরি করা হয়। একটি বাইক একটি কাদা বাইকের একটি সাধারণীকরণ। সুতরাং মাটির বাইকগুলি বাইক থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।
ক্লাসিকাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং
ক্লাসিকাল অবজেক্ট-ভিত্তিক প্রোগ্রামিংয়ে আমাদের দুটি ধরণের বিমূর্ততা রয়েছে: শ্রেণি এবং অবজেক্ট। পূর্বে উল্লিখিত একটি বস্তু হ'ল একটি বাস্তব বিশ্ব সত্তার বিমূর্ততা। অন্যদিকে একটি শ্রেণি হ'ল কোনও বস্তুর বা অন্য শ্রেণীর বিমূর্ততা (অর্থাত এটি একটি সাধারণীকরণ)। উদাহরণস্বরূপ, বিবেচনা করুন:
+----------------------+----------------+---------------------------------------+
| Level of Abstraction | Name of Entity | Comments |
+----------------------+----------------+---------------------------------------+
| 0 | John Doe | Real World Entity. |
| 1 | johnDoe | Variable holding object. |
| 2 | Man | Class of object johnDoe. |
| 3 | Human | Superclass of class Man. |
+----------------------+----------------+---------------------------------------+
আপনি যেমন ক্লাসিকাল অবজেক্ট-ভিত্তিক প্রোগ্রামিং ল্যাঙ্গুয়েজগুলিতে দেখতে পাচ্ছেন বস্তুগুলি কেবল বিমূর্ততা (অর্থাত্ সমস্ত বস্তুর বিমূর্ত স্তর 1 রয়েছে) এবং শ্রেণিগুলি কেবলমাত্র সাধারণীকরণ (অর্থাত্ সমস্ত শ্রেণীর বিমূর্ত স্তর 1 এর চেয়ে বেশি থাকে)।
শাস্ত্রীয় অবজেক্ট-ভিত্তিক প্রোগ্রামিং ভাষাগুলিতে অবজেক্টগুলি কেবল ক্লাস ইনস্ট্যান্ট করে তৈরি করা যেতে পারে:
class Human {
// ...
}
class Man extends Human {
// ...
}
Man johnDoe = new Man();
ক্লাসিকাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে সংক্ষেপে বস্তুগুলি বাস্তব বিশ্বের সত্তার বিমূর্ততা এবং শ্রেণিগুলি সাধারণীকরণ হয় (অর্থাত্ বস্তু বা অন্যান্য শ্রেণীর বিমূর্ততা)।
সুতরাং বিমূর্তির স্তর বাড়ার সাথে সাথে সত্তা আরও সাধারণ হয়ে ওঠে এবং বিমূর্ততার স্তর হ্রাস পাওয়ার সাথে সাথে সত্তা আরও নির্দিষ্ট হয়ে যায়। এই অর্থে বিমূর্তির স্তরটি আরও নির্দিষ্ট সত্তা থেকে আরও সাধারণ সত্তা পর্যন্ত স্কেলগুলির সাথে সমতুল্য।
প্রোটোটাইপাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং
প্রোটোটাইপাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি ক্লাসিকাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজের চেয়ে অনেক সহজ কারণ প্রোটোটাইপাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে আমাদের কেবল এক প্রকার বিমূর্ততা থাকে (অর্থাত্ অবজেক্টস)। উদাহরণস্বরূপ, বিবেচনা করুন:
+----------------------+----------------+---------------------------------------+
| Level of Abstraction | Name of Entity | Comments |
+----------------------+----------------+---------------------------------------+
| 0 | John Doe | Real World Entity. |
| 1 | johnDoe | Variable holding object. |
| 2 | man | Prototype of object johnDoe. |
| 3 | human | Prototype of object man. |
+----------------------+----------------+---------------------------------------+
যেমন আপনি প্রোটোটাইপাল অবজেক্ট-ভিত্তিক প্রোগ্রামিং ল্যাঙ্গুয়েজগুলিতে দেখতে পাচ্ছেন হ'ল বাস্তব জগতের সত্তা (যার ক্ষেত্রে এগুলিকে কেবল অবজেক্ট বলা হয়) বা অন্যান্য অবজেক্টের (যে ক্ষেত্রে এগুলিকে বিমূর্ত করা হয় সেগুলির প্রোটোটাইপ বলা হয়) ab সুতরাং একটি প্রোটোটাইপ হ'ল একটি সাধারণীকরণ।
প্রোটোটাইপাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে অবজেক্টগুলি প্রাক্তন নিহিলো তৈরি করা যেতে পারে (অর্থাত্ কিছুই নয়) বা অন্য কোনও বস্তু থেকে (যা সদ্য নির্মিত বস্তুর প্রোটোটাইপ হয়ে ওঠে):
var human = {};
var man = Object.create(human);
var johnDoe = Object.create(man);
আমার বিনীত মতে প্রোটোটাইপাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি ক্লাসিকাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষার চেয়ে বেশি শক্তিশালী কারণ:
- বিমূর্ততা কেবল এক ধরণের।
- সাধারণীকরণগুলি কেবল অবজেক্ট are
এতক্ষণে আপনি অবশ্যই শাস্ত্রীয় উত্তরাধিকার এবং প্রোটোটাইপাল উত্তরাধিকারের মধ্যে পার্থক্য বুঝতে পেরেছেন। শাস্ত্রীয় উত্তরাধিকার অন্যান্য শ্রেণি থেকে উত্তরাধিকার সূত্রে ক্লাসে সীমাবদ্ধ। তবে প্রোটোটাইপাল উত্তরাধিকারের মধ্যে কেবল প্রোটোটাইপগুলি অন্যান্য প্রোটোটাইপগুলি থেকে উত্তরাধিকার সূত্রে অন্তর্ভুক্ত থাকে না তবে প্রোটোটাইপগুলি থেকে উত্তরাধিকারসূত্রে প্রাপ্ত বিষয়গুলিও অন্তর্ভুক্ত থাকে।
প্রোটোটাইপ-শ্রেণীর আইসোমরফিজম
আপনি অবশ্যই লক্ষ্য করেছেন যে প্রোটোটাইপ এবং ক্লাসগুলি খুব একই রকম। সেটা সত্য. তারা হয়। বাস্তবে এগুলি এতটাই সমান যে আপনি প্রকৃতপক্ষে মডেল ক্লাসগুলিতে প্রোটোটাইপগুলি ব্যবহার করতে পারেন:
function CLASS(base, body) {
if (arguments.length < 2) body = base, base = Object.prototype;
var prototype = Object.create(base, {new: {value: create}});
return body.call(prototype, base), prototype;
function create() {
var self = Object.create(prototype);
return prototype.hasOwnProperty("constructor") &&
prototype.constructor.apply(self, arguments), self;
}
}
উপরের CLASS
ফাংশনটি ব্যবহার করে আপনি প্রোটোটাইপগুলি তৈরি করতে পারেন যা ক্লাসগুলির মতো দেখাচ্ছে:
var Human = CLASS(function () {
var milliseconds = 1
, seconds = 1000 * milliseconds
, minutes = 60 * seconds
, hours = 60 * minutes
, days = 24 * hours
, years = 365.2425 * days;
this.constructor = function (name, sex, dob) {
this.name = name;
this.sex = sex;
this.dob = dob;
};
this.age = function () {
return Math.floor((new Date - this.dob) / years);
};
});
var Man = CLASS(Human, function (Human) {
this.constructor = function (name, dob) {
Human.constructor.call(this, name, "male", dob);
if (this.age() < 18) throw new Error(name + " is a boy, not a man!");
};
});
var johnDoe = Man.new("John Doe", new Date(1970, 0, 1));
বিপরীতটি অবশ্য সত্য নয় (যেমন আপনি প্রোটোটাইপগুলির মডেল করতে ক্লাস ব্যবহার করতে পারবেন না)। এটি কারণ প্রোটোটাইপগুলি বস্তু তবে শ্রেণিগুলি বস্তু নয়। এগুলি বিমূর্ততার সম্পূর্ণ ভিন্ন ধরণের।
উপসংহার
সংক্ষেপে আমরা শিখেছি যে বিমূর্ততা হ'ল "নির্দিষ্ট উদাহরণগুলি থেকে সাধারণ বৈশিষ্ট্যগুলি বের করে একটি সাধারণ ধারণা" এবং সেই সাধারণীকরণটি "আরও নির্দিষ্ট বিমূর্তির বিমূর্ততা" । প্রোটোটাইপাল এবং শাস্ত্রীয় উত্তরাধিকারের মধ্যে পার্থক্য সম্পর্কে এবং আমরা কীভাবে উভয়ই একই মুদ্রার দুটি মুখ হিসাবে শিখেছি।
বিভাজক নোটে আমি মন্তব্য করতে চাই যে প্রোটোটাইপাল উত্তরাধিকারের দুটি ধরণ রয়েছে: প্রোটোটাইপাল প্যাটার্ন এবং কনস্ট্রাক্টরের ধরণ। প্রোটোটাইপাল প্যাটার্ন হ'ল প্রোটোটাইপাল উত্তরাধিকারের নীতিগত প্যাটার্ন যেখানে কনস্ট্রাক্টর প্যাটার্নটি প্রোটোটাইপাল উত্তরাধিকারটিকে আরও ধ্রুপদী উত্তরাধিকারের মতো দেখতে তৈরি করতে ব্যবহৃত হয়। ব্যক্তিগতভাবে আমি প্রোটোটাইপাল প্যাটার্নটি পছন্দ করি।
পিএস আমি সেই ব্যক্তি যিনি " কেন প্রোটোটাইপাল ইনহেরিটেন্স ম্যাটারস " ব্লগ পোস্ট লিখেছিলেন এবং " ক্লাসিকালের চেয়ে প্রোটোটাইপাল উত্তরাধিকারের সুবিধা? " প্রশ্নের উত্তর দিয়েছেন । আমার উত্তরটি স্বীকৃত উত্তর।