কোনও প্রকার এবং শ্রেণীর মধ্যে পার্থক্য এবং তারপরে সাব টাইপিং এবং সাবক্লাসিংয়ের মধ্যে পার্থক্যের মধ্যে ডুব দেওয়া সম্ভবত এটি প্রথম দরকারী।
এই উত্তরের বাকীটির জন্য আমি ধরে নিতে চলেছি যে আলোচনার ধরণগুলি স্থির প্রকারের (যেহেতু সাবটাইপিং সাধারণত একটি স্থির প্রসঙ্গে আসে)।
আমি একটি খেলনা সিউডোকোড বিকাশ করতে চলেছি যা একটি ধরণের এবং শ্রেণীর মধ্যে পার্থক্য বোঝাতে সাহায্য করে কারণ বেশিরভাগ ভাষা কমপক্ষে কিছু অংশে বিভক্ত হয় (ভাল কারণেই আমি সংক্ষেপে স্পর্শ করব)।
একটি প্রকার দিয়ে শুরু করা যাক। একটি টাইপ আপনার কোডে প্রকাশের জন্য একটি লেবেল। এই লেবেলের মান এবং এটি অন্যান্য লেবেলের মানগুলির সাথে সামঞ্জস্যপূর্ণ (কোনও ধরণের সিস্টেম-নির্দিষ্ট সংজ্ঞায়নের জন্য সামঞ্জস্যপূর্ণ) কিনা তা আপনার প্রোগ্রামটি পরিচালনা না করে কোনও বাহ্যিক প্রোগ্রাম (একটি টাইপেকার) দ্বারা নির্ধারণ করা যেতে পারে। এইগুলিই এই লেবেলগুলিকে তাদের নিজস্ব নামের জন্য বিশেষ এবং প্রাপ্য করে তোলে।
আমাদের খেলনা ভাষায় আমরা এ জাতীয় লেবেল তৈরির অনুমতি দিতে পারি।
declare type Int
declare type String
তারপরে আমরা বিভিন্ন ধরণের মান হিসাবে লেবেল রাখতে পারি।
0 is of type Int
1 is of type Int
-1 is of type Int
...
"" is of type String
"a" is of type String
"b" is of type String
...
এই বিবৃতি দিয়ে আমাদের typechecker এখন যেমন বিবৃতি প্রত্যাখ্যান করতে পারেন
0 is of type String
আমাদের টাইপ সিস্টেমের একটি প্রয়োজনীয়তা যদি প্রতিটি এক্সপ্রেশনটির একটি অনন্য টাইপ থাকে।
আসুন এখনই একপাশে ছেড়ে যাক এটি কীভাবে ছদ্মবেশী এবং কীভাবে আপনাকে অসীম সংখ্যার মত প্রকাশের ধরণ নির্ধারণ করতে সমস্যা হতে চলেছে। আমরা পরে এটিতে ফিরে আসতে পারি।
অন্যদিকে একটি শ্রেণি হ'ল পদ্ধতি এবং ক্ষেত্রগুলির সংকলন যা একত্রে গোষ্ঠীভুক্ত হয় (সম্ভাব্যত অ্যাক্সেস মডিফায়ার যেমন ব্যক্তিগত বা পাবলিক সহ)।
class StringClass:
defMethod concatenate(otherString): ...
defField size: ...
এই শ্রেণীর একটি উদাহরণ এই পদ্ধতি এবং ক্ষেত্রগুলির পূর্বনির্ধারিত সংজ্ঞা তৈরি বা ব্যবহার করার ক্ষমতা পায়।
আমরা ক্লাসকে এমন ধরণের সাথে সংযুক্ত করতে বেছে নিতে পারি যে শ্রেণীর প্রতিটি উদাহরণ স্বয়ংক্রিয়ভাবে সেই ধরণের সাথে লেবেলযুক্ত হয়।
associate StringClass with String
তবে প্রতিটি ধরণের একটি সম্পর্কিত বর্গ থাকা প্রয়োজন না।
# Hmm... Doesn't look like there's a class for Int
এটাও অনুমেয় যে আমাদের খেলনা ভাষায় প্রত্যেক শ্রেণীর একটি ধরণের থাকে না, বিশেষত যদি আমাদের সমস্ত এক্সপ্রেশনর ধরণ থাকে না। কিছু অভিব্যক্তির ধরন রয়েছে এবং কিছু না থাকলে কি ধরণের সিস্টেমের ধারাবাহিকতা নিয়মগুলি দেখতে হবে তা কল্পনা করা কিছুটা জটিল (তবে অসম্ভব নয়) to
তদুপরি আমাদের খেলনা ভাষায় এই সমিতিগুলি অনন্য হতে হবে না। আমরা একই ধরণের সাথে দুটি শ্রেণি সংযুক্ত করতে পারি।
associate MyCustomStringClass with String
এখন মনে রাখবেন যে আমাদের টাইপচেকারের কোনও অভিব্যক্তির মান ট্র্যাক করার কোনও প্রয়োজন নেই (এবং বেশিরভাগ ক্ষেত্রে এটি করা অসম্ভব বা অসম্ভব)। আপনি যে লেবেলগুলি বলেছেন তা কেবল এটিই জানেন। পূর্ববর্তী অনুস্মারক হিসাবে টাইপচেকার কেবলমাত্র 0 is of type String
আমাদের কৃত্রিমভাবে তৈরি টাইপ বিধিটির কারণে বিবৃতিটিকে প্রত্যাখ্যান করতে সক্ষম হয়েছিল যে এক্সপ্রেশনগুলির অবশ্যই অনন্য প্রকার থাকতে পারে এবং আমরা ইতিমধ্যে অভিব্যক্তিটিকে 0
অন্য কোনও লেবেল দিয়েছিলাম । এর মান সম্পর্কে কোনও বিশেষ জ্ঞান ছিল না 0
।
তাহলে সাবটাইপিংয়ের কী হবে? ওয়েল সাবটাইপিং টাইপচেকিংয়ের একটি সাধারণ নিয়মের একটি নাম যা আপনার অন্যান্য নিয়মগুলি শিথিল করে। A is subtype of B
যাহাতে যদি সর্বত্র আপনার টাইপ-চেকার একটি লেবেল দাবি করে তবে B
এটি কোনওটি গ্রহণ করবে A
।
উদাহরণস্বরূপ আমরা পূর্বে যা ছিল তার পরিবর্তে আমাদের সংখ্যার জন্য নিম্নলিখিতগুলি করতে পারি।
declare type NaturalNum
declare type Int
NaturalNum is subtype of Int
0 is of type NaturalNum
1 is of type NaturalNum
-1 is of type Int
...
সাবক্লাসিং একটি নতুন শ্রেণি ঘোষণার জন্য একটি শর্টহ্যান্ড যা আপনাকে পূর্বে ঘোষিত পদ্ধতি এবং ক্ষেত্রগুলি পুনরায় ব্যবহার করতে দেয়।
class ExtendedStringClass is subclass of StringClass:
# We get concatenate and size for free!
def addQuestionMark: ...
আমরা সহযোগী দৃষ্টান্ত হবে না ExtendedStringClass
সঙ্গে String
হচ্ছে আমরা করেছিল StringClass
, যেহেতু সব পরে এটি একটি সম্পূর্ণ নতুন বর্গ, আমরা শুধু যতটা লিখতে ছিল না। এটি আমাদেরকে এমন ExtendedStringClass
একটি টাইপ দেওয়ার অনুমতি দেয় String
যা টাইপচেকারের দৃষ্টিভঙ্গি থেকে সামঞ্জস্যপূর্ণ নয় ।
একইভাবে আমরা একটি সম্পূর্ণ নতুন বর্গ না করার সিদ্ধান্ত নিয়েছে পারতেন NewClass
এবং সম্পন্ন
associate NewClass with String
এখন প্রতিটি উদাহরণ টাইপচেকারের দৃষ্টিকোণ থেকে StringClass
প্রতিস্থাপিত NewClass
হতে পারে।
সুতরাং তত্ত্বের ক্ষেত্রে সাব টাইপিং এবং সাবক্লাসিং সম্পূর্ণ ভিন্ন জিনিস। তবে আমি যে ভাষা জানি না তার ধরন এবং শ্রেণি রয়েছে আসলে জিনিসগুলি এইভাবে করে। আসুন আমরা আমাদের ভাষাটি আলাদা করে শুরু করি এবং আমাদের কিছু সিদ্ধান্তের পিছনে যুক্তি ব্যাখ্যা করি।
প্রথমত, যদিও তত্ত্বের ক্ষেত্রে সম্পূর্ণ ভিন্ন শ্রেণিকে একই ধরণের দেওয়া যেতে পারে বা কোনও শ্রেণিকে একই ধরণের মান দেওয়া যেতে পারে যা কোনও শ্রেণীর উদাহরণ নয়, এটি টাইপচেকারের কার্যকারিতা গুরুতরভাবে বাধা দেয়। টাইপচেকার কার্যকরভাবে কোনও অভিব্যক্তির মধ্য দিয়ে আপনি যে পদ্ধতি বা ক্ষেত্রটি কল করছেন সেটি সেই মানটির সাথে রয়েছে কিনা তা যাচাই করার দক্ষতার সাথে কার্যকরভাবে ছিনতাই হয়ে গেছে, সম্ভবত আপনি যদি এটির সাথে খেলতে গিয়ে সমস্যায় পড়তে চান তবে আপনি যা চান typechecker। সর্বোপরি, কে জানে যে এই String
লেবেলের নীচে মূলত মূল্যটি কী; এটি এমন কিছু হতে পারে যা নেই, উদাহরণস্বরূপ, কোনও concatenate
পদ্ধতি!
ঠিক আছে, সুতরাং আমরা নির্ধারণ করি যে প্রতিটি শ্রেণি স্বয়ংক্রিয়ভাবে সেই শ্রেণীর মতো একই নামের একটি নতুন ধরণের তৈরি করে এবং associate
সেই ধরণের সাথে এর উদাহরণগুলি। এটা আমাদের পরিত্রাণ পেতে দেয় associate
মধ্যে বিভিন্ন নাম সেইসাথে StringClass
এবং String
।
একই কারণে, আমরা সম্ভবত দুটি শ্রেণীর যেখানে একটির অন্যের সাবক্লাস হয় তার মধ্যে একটি সাব টাইপ সম্পর্ক স্বয়ংক্রিয়ভাবে স্থাপন করতে চাই। সমস্ত সাবক্লাসের প্যারেন্ট ক্লাসের সমস্ত পদ্ধতি এবং ক্ষেত্রের গ্যারান্টিযুক্ত হওয়ার পরে, তবে বিপরীতটি সত্য নয়। অতএব সাবক্লাসটি যে কোনও সময় আপনার এক ধরণের প্যারেন্ট ক্লাসের প্রয়োজন হতে পারে এমন সময়, আপনার যদি সাবক্লাসের ধরণের প্রয়োজন হয় তবে প্যারেন্ট ক্লাসের ধরণটি প্রত্যাখ্যান করা উচিত।
আপনি যদি এই শর্তের সাথে একত্রিত হন যে সমস্ত ব্যবহারকারীর সংজ্ঞায়িত মানগুলি অবশ্যই কোনও শ্রেণীর উদাহরণ হতে পারে তবে আপনি is subclass of
ডাবল শুল্ক টানতে পারেন এবং পরিত্রাণ পেতে পারেন is subtype of
।
এবং এটি আমাদের সেই বৈশিষ্ট্যগুলিতে নিয়ে আসে যা বেশিরভাগ জনপ্রিয় স্ট্যাটিক্যালি টাইপ করা ওও ভাষাগুলি ভাগ করে। "আদিম" ধরনের (যেমন একটি সেট আছে int
, float
ইত্যাদি) যা কোন শ্রেণীর সঙ্গে যুক্ত করা হয় না এবং ব্যবহারকারী-সংজ্ঞায়িত নয়। তারপরে আপনার কাছে সমস্ত ব্যবহারকারী-সংজ্ঞায়িত ক্লাস রয়েছে যার স্বয়ংক্রিয়ভাবে একই নামের প্রকার রয়েছে এবং সাব-টাইপিং সহ সাবক্লাসিং সনাক্ত করুন।
আমি যে চূড়ান্ত নোটটি করব তা হ'ল মানগুলি থেকে পৃথকভাবে ঘোষণার ধরণের ক্লিনকি। বেশিরভাগ ভাষাগুলি এই দুটিয়ের সৃষ্টির সাথে মিলিত হয়, যাতে কোনও প্রকারের ঘোষণাপত্রটি সম্পূর্ণরূপে নতুন মান তৈরি করার জন্য একটি ঘোষণার জন্য যা স্বয়ংক্রিয়ভাবে সেই ধরণের সাথে লেবেলযুক্ত। উদাহরণস্বরূপ, একটি শ্রেণীর ঘোষণা সাধারণত উভয় প্রকারের পাশাপাশি সেই ধরণের মানগুলি ইনস্ট্যান্ট করে তোলার একটি উপায়ও তৈরি করে। এটি কিছুটা অসতর্কতা থেকে মুক্তি পেয়েছে এবং নির্মাতাদের উপস্থিতিতে আপনাকে এক স্ট্রোকের ধরণের সাহায্যে অসীম অনেকগুলি মান তৈরি করতে দেয়।