স্কালায় প্রতিটি অন্যান্য ধরণের উপ-টাইপ কীভাবে হয় না


19

আমি স্কেল সহ ফাংশনাল প্রোগ্রামিংয়ে মার্টিন ওডারস্কির কোর্স কোর্স গ্রহণ করছি এবং আপাতত আমি দুটি বিষয় শিখেছি যা একত্রে লাভ হয় না:

  1. স্কালা একাধিক উত্তরাধিকার সমর্থন করে না
  2. Nothing প্রতিটি অন্যান্য ধরণের একটি সাব টাইপ

এই দুটি বিবৃতি একসাথে থাকতে পারে না, তবে ঠিক কীভাবে এটি করা হয়? এবং "প্রতিটি অন্যান্য ধরণের উপপ্রকার" এর অর্থ কী?

সম্পাদনা 1

ইন Scala এপিআই , Nothingহিসাবে সংজ্ঞায়িত করা হয় abstract final class Nothing extends Any... তাই এটি অন্য ক্লাসের কিভাবে প্রসারিত করতে পারেন?


এই পৃষ্ঠাটি কিছুটা সহায়তা করতে পারে: artima.com/pins1ed/scalas-hierarchy.html
j jhlett

যতদূর আমি দেখতে পাচ্ছি এটিকে "চূড়ান্ত বৈশিষ্ট্য কিছুই বাড়িয়ে দেয়
ডেন

8
আপনি বিভ্রান্তিকর ধরণের এবং ক্লাস করছেন। এই দুটি খুব ভিন্ন জিনিস। শুধুমাত্র এক যারা যে পার্থক্য দ্বারা বিভ্রান্ত করা হয়, এবং দুর্ভাগ্যবশত, তাই না সত্যিই দুর্ভাগ্যবশত, যারা বিভ্রান্ত কিছু জাভা, C # এবং সি ++ এর মত জনপ্রিয় ভাষার ডিজাইনার হতে ঘটতে। এটি এটি বলে না যে Nothingএটি প্রতিটি অন্যান্য শ্রেণীর একটি সাবক্লাস। এটি বলে যে এটি প্রতিটি অন্যান্য ধরণের একটি উপপ্রকার
Jörg ডব্লু মিটাগ

1
@ ডেলান: জাভার ইন্টারফেসগুলি সরাসরি ছোট্টকলের প্রোটোকল থেকে নেওয়া হয়। স্মলটাল্কে, কেবল প্রোটোকলগুলি প্রকার, ক্লাস হয় না। জাভাতে, উভয় ইন্টারফেস এবং ক্লাস এক ধরণের। ওইটা ভুল. ক্লাসগুলি প্রকার নয়, কেবল ইন্টারফেস। এই ভাষাগুলির সকলের মধ্যেই এমন ধরণের জিনিস রয়েছে যা শ্রেণি নয় ir সমস্যাটি হ'ল সেই ভাষাগুলিতে শ্রেণিগুলি ধরণের, যা ভুল।
Jörg W Mittag

1
@ জার্গডব্লিউমিটাগ এটি একটি ভিন্ন বক্তব্য, এবং অত্যন্ত তর্কযোগ্য (আমি এটির পক্ষে ক্ষতিকারক যে সম্মত হন, তবে আমি এটি টাইপিংয়ের ভুল বোঝাবুঝির জন্য দায়ী করব না)। এখানে এটি নিয়ে আলোচনা করার কোনও অর্থ নেই।

উত্তর:


27

সাবটাইপিং এবং উত্তরাধিকার দুটি ভিন্ন জিনিস! সবকিছু প্রসারিতNothing করে না , এটি একটি উপপ্রকার , এটি কেবল প্রসারিত করে ।Any

স্পেসিফিকেশন [§3.5.2] একটি বিশেষ subtyping-সম্পর্ক নিয়ন্ত্রণকারী কেস আছে Nothing:

.53.5.2 কনফরমেন্স

  • [...]
  • প্রতিটি মান প্রকারের জন্য
    T,scala.Nothing <: T <:scala.Any
  • প্রতিটি ধরণের নির্মাতার জন্য T(যে কোনও ধরণের পরামিতিগুলির সাথে)
    scala.Nothing <: T <: scala.Any
  • [...]

<:মূলত যেখানে "একটি উপপ্রকার" এর অর্থ।

এটি কীভাবে করা হয় তা হিসাবে: আমরা জানি না, এটি সংকলক যাদু এবং বাস্তবায়নের বিশদ।

প্রায়শই একটি ভাষা প্রোগ্রামার হিসাবে আপনাকে যা করতে পারে তা করতে পারে না। প্রতিপক্ষ হিসাবে Nothing: স্কালার Anyসমস্ত কিছুই হ'ল উত্তরাধিকার সূত্রে প্রাপ্ত Any। কেন Anyকিছু থেকে উত্তরাধিকার হয় না ? আপনি এটা করতে পারবেন না। স্কেলা কেন এটি করতে পারে? ঠিক আছে, কারণ স্কালা নিয়মগুলি সেট করে, আপনি না। Nothingসব কিছুর উপপ্রকার হওয়াই এটির একটি অন্য উদাহরণ।


10
বিটিডাব্লু: এটি nullজাভাতে প্রতিটি ধরণের ক্ষেত্রের ক্ষেত্রে নির্ধারিত হওয়ার মতো । কেন এটা সম্ভব? কি nullযে ক্লাসের একটা নিদর্শন? না, এটি সম্ভব কারণ সংকলক তাই বলে। সময়কাল।
Jörg ডব্লু মিটাগ

8
আমি যদি এটিকে একশবার উপস্থাপন করতে পারতাম, আমি করতাম। বিভ্রান্তিকর ধরণ এবং শ্রেণি জাভা এর মতো ভাষা আমাদের কাছে নিয়ে এসেছে worst
Jörg ডব্লু মিটাগ

1
উত্তরাধিকার মধ্যে পার্থক্য সম্পর্কে জানতে আগ্রহী আত্মার জন্য এবং উপশাখাকে cmi.ac.in/~madhavan/courses/pl2006/lecturenotes/lecture-notes/... তবে আমি এটা কিনতে পারি না - মত যদি আপনি উত্তরাধিকারী ( extendsরচনা করার জাভা, এবং ) আপনি সর্বোপরি সাব টাইপিংয়ের জন্য এটি করেন।
গ্রীনল্ডম্যান

11

যখন তিনি বলেন যে স্কালা একাধিক উত্তরাধিকার সমর্থন করে না, তখন তিনি একাধিকবার কোনও পদ্ধতি প্রয়োগের উত্তরাধিকার সূত্রে বোঝায়। অবশ্যই আপনি একটি শ্রেণিতে একাধিক ইন্টারফেস / বৈশিষ্ট্য প্রয়োগ করতে পারেন এবং তারা একই পদ্ধতিটিকে সংজ্ঞায়িত করতে পারে তবে বৈশিষ্ট্য রৈখিককরণের কারণে আপনি বিভিন্ন প্রয়োগের মধ্যে দ্বন্দ্ব পান না।

সাধারণভাবে, যদি আপনার C1কোনও পদ্ধতি সহ একটি f()শ্রেণি থাকে C2এবং কোনও পদ্ধতি সহ কোনও শ্রেণি থাকে f(), তবে একাধিক উত্তরাধিকারের অর্থ আপনি কোনওভাবেই উভয় প্রয়োগের উত্তরাধিকারী হতে পারেন f()। এটি বিভিন্ন সমস্যার সৃষ্টি করতে পারে, যা স্ক্যালাল কেবলমাত্র আপনাকে একক শ্রেণীর উত্তরাধিকার সূত্রে এবং বৈশিষ্ট্যের ক্রমের ভিত্তিতে একটি বাস্তবায়ন নির্বাচন করে একাধিক বৈশিষ্ট্যের ক্ষেত্রে সমাধান করার মাধ্যমে সমাধান করে।

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

একবার আপনি বুঝতে পারবেন যে বৈশিষ্ট্য রৈখিককরণ উত্তরাধিকারের যে কোনও অস্পষ্টতাকে কার্যকরভাবে মুছে ফেলে এবং আমরা একাধিক বৈশিষ্ট্য থেকে উত্তরাধিকার হিসাবে একাধিক উত্তরাধিকার হিসাবে উল্লেখ করি না , তবে আপনার ভাল হওয়া উচিত।

এটি কীভাবে উপলব্ধি করা যায়: সংকলক শেষ পর্যন্ত এর জন্য দায়ী। দেখুন Scala ভাষা স্পেসিফিকেশন অধ্যায় 3.5.2 অনুরূপ, যাতে অন্যান্য বৈশিষ্ট্য মধ্যে রয়েছে:

For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.

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

এখানে একটি গুরুত্বপূর্ণ বিষয়টি হ'ল এখানে টাইপের কোনও উদাহরণ নেই Nothing, সুতরাং, এর চিকিত্সা কঠোরভাবে টাইপ-চেকিংয়ের মধ্যে সীমাবদ্ধ, যা সমস্ত সংকলকটির রাজ্যে।


2
আমি এখনও বুঝতে পারি না এটি কীভাবে হয় ... আমার প্রশ্নের সম্পাদনা দেখুন
ভাইনো

1
"সাবটাইপ হিসাবে কোনও কিছুর সংজ্ঞা দেওয়ার প্রাসঙ্গিকতা সব জায়গাতেই সীমাবদ্ধ নয় যেখানে সাব টাইপিং প্রাসঙ্গিক।" আপনি এটি দিয়ে কি বোঝাতে চান? এক্স প্রাসঙ্গিক যেখানে এক্স প্রাসঙ্গিক?
ফ্যান্ট0 মি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.