সাবক্লাস এবং সাব টাইপের মধ্যে পার্থক্য কী?


44

লিসকভ সাবস্টিটিউশন নীতিমালা সম্পর্কে এই প্রশ্নের সর্বাধিক রেট করা উত্তর সাব- টাইপ এবং সাবক্লাস শর্তাবলী মধ্যে পার্থক্য করতে ব্যথা নেয় । এটি এটিকেও বোঝায় যে কিছু ভাষাগুলি দুটিকে সংমিশ্রিত করে, অন্যদিকে তা দেয় না।

(পাইথন, সি ++) এর সাথে আমি সবচেয়ে বেশি পরিচিত অবজেক্ট-ভিত্তিক ভাষার জন্য, "টাইপ" এবং "শ্রেণি" সমার্থক ধারণা। সি ++ এর ক্ষেত্রে, সাব টাইপ এবং সাবক্লাসের মধ্যে পার্থক্য থাকার অর্থ কী? উদাহরণস্বরূপ বলুন, Fooএটি একটি সাবক্লাস, তবে একটি উপপ্রকার নয় FooBase। যদি fooএকটি দৃষ্টান্ত হল Foo, would এই লাইন:

FooBase* fbPoint = &foo;

আর বৈধ হবে না?


6
আসলে, পাইথনে "টাইপ" এবং "শ্রেণি" স্বতন্ত্র ধারণা। বস্তুত, পাইথন পরিবর্তনশীল টাইপ করা হচ্ছে, "টাইপ" একটি ধারণা এ সব পাইথন হবে। দুর্ভাগ্যক্রমে, পাইথন বিকাশকারীরা এটি বুঝতে পারে না এবং এখনও দুটিকে সংযুক্ত করে।
Jörg W Mittag

11
"টাইপ" এবং "শ্রেণি" সি ++ তেও স্বতন্ত্র। "Ints of arts" একটি প্রকার; এটা কোন ক্লাস? "টাইপ ইন্টের ভেরিয়েবলের পয়েন্টার" একটি প্রকার; এটা কোন ক্লাস? এই জিনিসগুলি কোনও শ্রেণি নয়, তবে তারা অবশ্যই প্রকারের।
এরিক লিপার্ট

2
আমি এই প্রশ্নটি এবং সেই উত্তরটি পড়ে খুব অবাক হয়েছি।
ব্যবহারকারী369450

4
@ জর্জ ডব্লিউমিত্যাগ যদি পাইথনে "ধরণের" ধারণা না থাকে তবে যে কেউ ডকুমেন্টেশন লিখতে হবে সেটিকে
ম্যাট

@ ম্যাটটি ন্যায্য হতে পারে, প্রকারগুলি এটিকে 3.5 এ তৈরি করেছে যা খুব সাম্প্রতিককালে, বিশেষত-আই-এম-মঞ্জুরিতে-ব্যবহার-ইন-উত্পাদন-মান দ্বারা।
জারেড স্মিথ

উত্তর:


53

সাবটাইপিং হ'ল একধরণের পলিমারফিজম যেখানে একটি সাব টাইপ একটি ডেটাটাইপ যা অন্য কোনও ডেটাটাইপ (সুপারটাইপ) এর সাথে কিছু সাবস্টিটিবিলিটির ধারণার সাথে সম্পর্কিত, যার অর্থ প্রোগ্রামের উপাদানগুলি, সাধারণত সাবরুটাইনস বা ফাংশন, সুপারটাইপের উপাদানগুলিতে কাজ করার জন্য রচনা করা যেতে পারে সাব টাইপের উপাদানগুলিতে কাজ করে।

যদি এটির Sএকটি Tসাব S <: Tটাইপ হয় তবে সাব টাইপিং সম্পর্কটি প্রায়শই লিখিত হয় , এর অর্থ হ'ল যে কোনও ধরণের শব্দটি Sপ্রসঙ্গে নিরাপদে ব্যবহার করা যেতে পারে যেখানে টাইপের একটি শব্দ Tপ্রত্যাশিত। গুরুতরভাবে সাবটিপিংয়ের সুনির্দিষ্ট শব্দার্থবিজ্ঞান প্রদত্ত প্রোগ্রামিং ভাষায় "যেখানে একটি প্রসঙ্গে নিরাপদে ব্যবহৃত হয়েছে" তার অর্থের বিবরণ নির্ভর করে।

সাবক্লাসিং সাব-টাইপিংয়ের সাথে বিভ্রান্ত হওয়া উচিত নয়। সাধারণভাবে, সাবটাইপিং একটি সম্পর্ক স্থাপন করে, যখন সাবক্লাসিং কেবল প্রয়োগকে পুনরায় ব্যবহার করে এবং একটি সিন্ট্যাক্টিক সম্পর্ক স্থাপন করে, অগত্যা একটি শব্দার্থিক সম্পর্ক নয় (উত্তরাধিকার আচরণের সাব-টাইপিং নিশ্চিত করে না)।

এই ধারণাগুলি পৃথক করার জন্য, সাব টাইপিং ইন্টারফেস উত্তরাধিকার হিসাবেও পরিচিত , যেখানে সাবক্লাসিং বাস্তবায়ন উত্তরাধিকার বা কোড উত্তরাধিকার হিসাবে পরিচিত

সূত্র
সাবটিপিং
উত্তরাধিকার


1
খুব ভাল বলেছেন. এই প্রশ্নের প্রসঙ্গে এটি উল্লেখযোগ্য হতে পারে যে টাইপ সিস্টেমে সাব-টাইপিং সম্পর্কগুলি যোগাযোগ করার জন্য সি ++ প্রোগ্রামাররা প্রায়শই খাঁটি ভার্চুয়াল বেস শ্রেণি নিয়োগ করে। জেনেরিক প্রোগ্রামিং পদ্ধতির প্রায়শই অবশ্যই পছন্দ করা হয়।
আলুয়ান হাদাদাদ

6
"সাবটিপিংয়ের সঠিক শব্দার্থবিজ্ঞান" প্রদত্ত প্রোগ্রামিং ভাষায় যেখানে "একটি প্রসঙ্গে নিরাপদে ব্যবহৃত হয়েছে" তার বিবরণগুলির উপর নির্ভর করে। … এবং এলএসপি "সুরক্ষিত" এর অর্থ সম্পর্কে কিছুটা যুক্তিসঙ্গত ধারণা সংজ্ঞায়িত করে এবং আমাদের জানায় যে এই বিশেষ ফর্মটিকে "সুরক্ষা" সক্ষম করার জন্য এই বিবরণীদের কীভাবে সীমাবদ্ধ করতে হবে বাধা রয়েছে।
Jörg ডব্লু মিট্টাগ

স্তূপের উপরে আরও একটি নমুনা: যদি আমি সঠিকভাবে বুঝতে পারি, সি ++ এ, publicউত্তরাধিকার একটি উপ-প্রকারের privateপরিচয় দেয় এবং উত্তরাধিকার একটি সাবক্লাসের সাথে পরিচয় করে।
কোয়ান্টিন

@ কুইন্টিনের সার্বজনীন উত্তরাধিকার হ'ল একটি সাব-টাইপ এবং সাবক্লাস উভয়ই, তবে ব্যক্তিগত তবে এটি কেবল একটি সাবক্লাস, তবে সাব টাইপ নয়। আপনার জাভা ইন্টারফেসের মতো কাঠামোর সাথে সাবক্লাসিং ছাড়াই সাব টাইপিং থাকতে পারে
14:25

27

একটি প্রকার , আমরা এখানে যে প্রসঙ্গে কথা বলছি তা হ'ল মূলত আচরণগত গ্যারান্টিগুলির একটি সেট। একটি চুক্তি , আপনি যদি। বা, প্রোটোকল স্মলটালকের কাছ থেকে ধার গ্রহণের পরিভাষা ।

একটি শ্রেণি হল পদ্ধতির একটি বান্ডিল। এটি আচরণের বাস্তবায়নগুলির একটি সেট ।

সাব টাইপিং প্রোটোকলকে পরিমার্জন করার একটি মাধ্যম। সাবক্লাসিং হল ডিফারেনশিয়াল কোড পুনরায় ব্যবহারের একটি মাধ্যম, অর্থাত্ আচরণের পার্থক্য বর্ণনা করে কোডটি পুনরায় ব্যবহার করা।

আপনি যদি জাভা বা সি♯ ব্যবহার করেন, তবে আপনি সমস্ত ধরণের প্রকারের হওয়া উচিত এমন পরামর্শটি পেয়ে এসেছেন interface। বাস্তবে, আপনি যদি উইলিয়াম কুকের অনানুষ্ঠানিক ডেটা বিমূর্ততা পুনর্বিবেচিত পড়েন তবে আপনি জানতে পারেন যে এই ভাষাগুলিতে ওও করার জন্য আপনাকে অবশ্যইinterface ধরণের হিসাবে ব্যবহার করতে হবে । (এছাড়াও, মজাদার ঘটনা: জাভা interfaceসরাসরি অবজেক্টিভ-সি এর প্রোটোকল থেকে আঁকল , যা ঘুরেফিরে ছোট্ট টাল্ক থেকে নেওয়া হয়))

এখন, যদি আমরা সেই কোডিংয়ের পরামর্শটিকে তার যৌক্তিক উপসংহারে অনুসরণ করি এবং জাভার এমন একটি সংস্করণ কল্পনা করি, যেখানে কেবলমাত্র interface প্রকারভেদ হয়, এবং শ্রেণি এবং আদিমতাগুলি না হয়, তবে interfaceঅন্যের কাছ থেকে উত্তরাধিকার সূত্রে একটি পৃথক সম্পর্ক তৈরি করবে, অন্যদিকে classঅন্যটির কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ব্যক্তি কেবলমাত্র ডিফারেনশিয়াল কোড-পুনরায় ব্যবহারের জন্য হয়ে উঠুন super

যতদূর আমি জানি, মূলধারার কোনও স্ট্যাটিকালি টাইপ করা ভাষা নেই যা উত্তরাধিকার সূত্রে প্রাপ্ত কোড (বাস্তবায়ন উত্তরাধিকার / সাবক্লাসিং) এবং উত্তরাধিকারসূত্রে চুক্তি ( সাব টাইপিং) এর মধ্যে কঠোরভাবে পার্থক্য করে । জাভা এবং C♯ সালে ইন্টারফেস উত্তরাধিকার বিশুদ্ধ subtyping (বা অন্তত ছিল, জাভা 8 ডিফল্ট পদ্ধতি প্রবর্তনের এবং পাশাপাশি সম্ভবত C♯ 8 পর্যন্ত), কিন্তু শ্রেণী উত্তরাধিকার হয় এছাড়াও বাস্তবায়ন উত্তরাধিকার সেইসাথে subtyping। আমি একটি পরীক্ষামূলক স্ট্যাটিক্যালি টাইপ করা অবজেক্ট ওরিয়েন্টেড পাতার মর্মর উপভাষা, যা কঠোরভাবে মধ্যে আলাদা সম্পর্কে পড়া মনে mixins (যা ধারণ করে , আচরণ) structs মধ্যে (যা রাষ্ট্র ধারণ), ইন্টারফেসগুলি (যা বর্ণনাআচরণ), এবং ক্লাসগুলি (যা এক বা একাধিক মিক্সিনের সাথে শূন্য বা আরও বেশি স্ট্রাইক রচনা করে এবং এক বা একাধিক ইন্টারফেসের সাথে সামঞ্জস্য করে) শুধুমাত্র ক্লাসগুলি ইনস্ট্যান্ট করা যায় এবং কেবলমাত্র ইন্টারফেসগুলি ধরণ হিসাবে ব্যবহৃত হতে পারে।

পাইথন, রুবি, ইসিএমএসস্ক্রিপ্ট বা স্মলটালকের মতো একটি গতিশীল টাইপ করা ওও ভাষায় আমরা সাধারণত কোনও অবজেক্টের প্রকার (গুলি) প্রোটোকলের সেট হিসাবে রূপান্তর করি যা সেটিকে মানায়। বহুবচনটি নোট করুন: একটি বস্তুর একাধিক প্রকার থাকতে পারে এবং আমি কেবল এই বিষয়টির কথা বলছি না যে টাইপের প্রতিটি বস্তুও টাইপের Stringএকটি বস্তু Object। (বিটিডাব্লু: নোট করুন যে আমি শ্রেণীর নামগুলি কীভাবে প্রকারের বিষয়ে কথা বলার জন্য ব্যবহার করেছি? আমার কতটা বোকা!) কোনও বস্তু একাধিক প্রোটোকল প্রয়োগ করতে পারে। উদাহরণস্বরূপ, রুবিতে Arraysএটিকে যুক্ত করা যায়, সেগুলি সূচকযুক্ত করা যায়, তাদের পুনরাবৃত্তি করা যেতে পারে এবং তাদের তুলনা করা যায়। এগুলি চারটি আলাদা প্রোটোকল যা তারা প্রয়োগ করে!

এখন, রুবির ধরণের নেই। তবে রুবি সম্প্রদায়ের ধরণ রয়েছে! যদিও এগুলি কেবল প্রোগ্রামারদের প্রধানেই বিদ্যমান। এবং ডকুমেন্টেশন। উদাহরণস্বরূপ, যে কোনও অবজেক্ট যে কোনও পদ্ধতির প্রতিক্রিয়া জানায় eachযার উপাদানগুলি একে একে ফলন করে তা একটি গণনামূলক অবজেক্ট হিসাবে বিবেচনা করা হয় । এবং এখানে একটি মিশিন রয়েছে Enumerableযা এই প্রোটোকলের উপর নির্ভর করে। সুতরাং, যদি আপনার বস্তুর সঠিক হয়েছে টাইপ (যা শুধুমাত্র প্রোগ্রামার মাথার বিদ্যমান), তারপর তাতে (থেকে উত্তরাধিকারী) মিশ্রিত করা অনুমোদিত হয় Enumerablemixin, এবং এটি ভাল জন্য বিনামূল্যে, মত শীতল পদ্ধতি সমস্ত প্রকারের পেতে map, reduce, filterএবং তাই উপর.

অনুরূপভাবে, একটি বস্তুর সাড়া যদি <=>, তারপর এটি বাস্তবায়ন বিবেচনা করা হয় তুলনীয় প্রোটোকল, এবং এটি মিশ্রিত করা যাবে Comparablemixin এবং ভালো জিনিস পেতে <, <=, >, <=, ==, between?, এবং clampবিনামূল্যে জন্য। তবে এটি নিজেও এই সমস্ত পদ্ধতি প্রয়োগ করতে পারে এবং উত্তরাধিকার সূত্রে প্রাপ্ত Comparableহয় না এবং এটি এখনও তুলনীয় হিসাবে বিবেচিত হবে ।

একটি ভাল উদাহরণ StringIOগ্রন্থাগার, যা মূলত fakes ইনপুট / আউটপুট স্ট্রিং সঙ্গে স্রোত বইবে। এটি IOক্লাসের মতো একই পদ্ধতিগুলি প্রয়োগ করে তবে উভয়ের মধ্যে কোনও উত্তরাধিকারের সম্পর্ক নেই। তবুও, একটি যে StringIOকোনও জায়গায় ব্যবহার করা IOযেতে পারে। এই ইউনিট পরীক্ষা, যেখানে আপনি একটি ফাইল বা প্রতিস্থাপন করতে পারেন মধ্যে খুবই দরকারী stdinএকটি সঙ্গে StringIOআপনার প্রোগ্রাম কোনো পরবর্তী পরিবর্তন করতে না করেও। যেহেতু StringIOএকই প্রোটোকলের সাথে সঙ্গতিপূর্ণ IO, সেগুলি উভয়ই একই ধরণের, যদিও তারা বিভিন্ন শ্রেণি, এবং কোনও সম্পর্ক ভাগ করে না (তারা উভয়ই Objectকোনও কোনও সময়ে প্রসারিত তুচ্ছ ব্যতীত )।


ভাষাগুলি একযোগে শ্রেণীর ধরণের এবং একটি ইন্টারফেস যার জন্য সেই শ্রেণিটি একটি বাস্তবায়ন হিসাবে ঘোষণা করার অনুমতি দেয় এবং বাস্তবায়নগুলি "কনস্ট্রাক্টর" (যা ইন্টারফেস দ্বারা নির্দিষ্ট ক্লাসগুলির নির্মাণকারীদের শৃঙ্খলিত করতে পারে) নির্দিষ্ট করার অনুমতি দেয় তবে এটি সহায়ক হতে পারে। যে ধরণের অবজেক্টের জন্য রেফারেন্সগুলি সর্বজনীনভাবে ভাগ করা হবে তার জন্য, পছন্দসই প্যাটার্নটি হ'ল শ্রেণীর প্রকারটি কেবলমাত্র উত্পন্ন শ্রেণি তৈরি করার সময় ব্যবহৃত হবে; বেশিরভাগ তথ্যসূত্র ইন্টারফেসের ধরণের হওয়া উচিত। ইন্টারফেস
নির্মাতাদের

... উদাহরণস্বরূপ কোডের একটি সংগ্রহ দরকার যা মানগুলির একটি নির্দিষ্ট সেটকে সূচক দ্বারা পড়ার অনুমতি দেবে, তবে এটি কী ধরণের তা সত্যিই যত্ন করে না। ক্লাস এবং ইন্টারফেসগুলিকে স্বতন্ত্র প্রকারের হিসাবে স্বীকৃতি দেওয়ার যথাযথ কারণগুলি রয়েছে, এমন অনেকগুলি পরিস্থিতি রয়েছে যেখানে ভাষাগুলি বর্তমানে মঞ্জুরি দেওয়ার চেয়ে তাদের আরও একত্রে কাজ করতে সক্ষম হওয়া উচিত।
সুপারক্যাট

আপনার কাছে কি রেফারেন্স আছে বা কিছু কীওয়ার্ড রয়েছে যে পরীক্ষামূলক এলআইএসপি উপভাষা সম্পর্কে আপনি আরও উল্লেখ করেছেন যে আপনি উল্লেখ করেছেন যে মিক্সিন, স্ট্রাক্ট, ইন্টারফেস এবং ক্লাসগুলি আনুষ্ঠানিকভাবে আলাদা করে?
টেলিফোন করুন

@tel: না, দুঃখিত। এটি সম্ভবত প্রায় 15-20 বছর আগে ছিল এবং সেই সময়ে আমার আগ্রহগুলি জায়গা জুড়ে ছিল। আমি যখন এটির পিছনে হোঁচট খেয়েছি তখন আমি কী বলতে চাইছিলাম তা সম্ভবত আপনি বলতে শুরু করতে পারলাম না।
Jörg ডব্লু মিটাগ

Awww। এই উত্তরগুলির মধ্যে সবচেয়ে আকর্ষণীয় বিবরণ ছিল। এই ধারণাগুলির একটি আনুষ্ঠানিক পৃথকীকরণ একটি ভাষার বাস্তবায়নের মধ্যে আসলেই সম্ভব যে সত্যই আমার জন্য শ্রেণি / প্রকারের পার্থক্যকে স্ফটিক করতে সাহায্য করেছিল। আমি অনুমান করি যে কোনও পরিস্থিতিতে আমি নিজেই এই এলআইএসপি খুঁজছি looking আপনি যদি জার্নাল নিবন্ধ / বইতে এটি সম্পর্কে পড়েন বা আপনি কেবল কথোপকথনে শুনেছেন তবে কি মনে আছে?
টেলিফোন করুন

2

কোনও প্রকার এবং শ্রেণীর মধ্যে পার্থক্য এবং তারপরে সাব টাইপিং এবং সাবক্লাসিংয়ের মধ্যে পার্থক্যের মধ্যে ডুব দেওয়া সম্ভবত এটি প্রথম দরকারী।

এই উত্তরের বাকীটির জন্য আমি ধরে নিতে চলেছি যে আলোচনার ধরণগুলি স্থির প্রকারের (যেহেতু সাবটাইপিং সাধারণত একটি স্থির প্রসঙ্গে আসে)।

আমি একটি খেলনা সিউডোকোড বিকাশ করতে চলেছি যা একটি ধরণের এবং শ্রেণীর মধ্যে পার্থক্য বোঝাতে সাহায্য করে কারণ বেশিরভাগ ভাষা কমপক্ষে কিছু অংশে বিভক্ত হয় (ভাল কারণেই আমি সংক্ষেপে স্পর্শ করব)।

একটি প্রকার দিয়ে শুরু করা যাক। একটি টাইপ আপনার কোডে প্রকাশের জন্য একটি লেবেল। এই লেবেলের মান এবং এটি অন্যান্য লেবেলের মানগুলির সাথে সামঞ্জস্যপূর্ণ (কোনও ধরণের সিস্টেম-নির্দিষ্ট সংজ্ঞায়নের জন্য সামঞ্জস্যপূর্ণ) কিনা তা আপনার প্রোগ্রামটি পরিচালনা না করে কোনও বাহ্যিক প্রোগ্রাম (একটি টাইপেকার) দ্বারা নির্ধারণ করা যেতে পারে। এইগুলিই এই লেবেলগুলিকে তাদের নিজস্ব নামের জন্য বিশেষ এবং প্রাপ্য করে তোলে।

আমাদের খেলনা ভাষায় আমরা এ জাতীয় লেবেল তৈরির অনুমতি দিতে পারি।

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ইত্যাদি) যা কোন শ্রেণীর সঙ্গে যুক্ত করা হয় না এবং ব্যবহারকারী-সংজ্ঞায়িত নয়। তারপরে আপনার কাছে সমস্ত ব্যবহারকারী-সংজ্ঞায়িত ক্লাস রয়েছে যার স্বয়ংক্রিয়ভাবে একই নামের প্রকার রয়েছে এবং সাব-টাইপিং সহ সাবক্লাসিং সনাক্ত করুন।

আমি যে চূড়ান্ত নোটটি করব তা হ'ল মানগুলি থেকে পৃথকভাবে ঘোষণার ধরণের ক্লিনকি। বেশিরভাগ ভাষাগুলি এই দুটিয়ের সৃষ্টির সাথে মিলিত হয়, যাতে কোনও প্রকারের ঘোষণাপত্রটি সম্পূর্ণরূপে নতুন মান তৈরি করার জন্য একটি ঘোষণার জন্য যা স্বয়ংক্রিয়ভাবে সেই ধরণের সাথে লেবেলযুক্ত। উদাহরণস্বরূপ, একটি শ্রেণীর ঘোষণা সাধারণত উভয় প্রকারের পাশাপাশি সেই ধরণের মানগুলি ইনস্ট্যান্ট করে তোলার একটি উপায়ও তৈরি করে। এটি কিছুটা অসতর্কতা থেকে মুক্তি পেয়েছে এবং নির্মাতাদের উপস্থিতিতে আপনাকে এক স্ট্রোকের ধরণের সাহায্যে অসীম অনেকগুলি মান তৈরি করতে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.