আমি কী সঠিকভাবে বুঝতে পারি যে হাঁসের টাইপ করা ভাষায় স্বাভাবিকের মতো লিসকভ সাবস্টিটিউশন নীতিমালা এমন ভাষাগুলিতে পালন করা যায় না যেখানে বস্তুগুলি নিজেরাই পরিদর্শন করতে পারে?
উদাহরণস্বরূপ, রুবি, যদি একটি বর্গ B
একটি বর্গ থেকে উত্তরাধিকারী A
, তারপর প্রতি বস্তুর x
এর A
, x.class
ফিরে যাচ্ছে A
, কিন্তু যদি x
হল একটি অবজেক্ট B
, x.class
আসতে যাচ্ছে না A
।
এখানে এলএসপির বিবৃতি দেওয়া হল:
টি (x) টির মতো টি x এর অবজেক্টগুলির সম্পর্কে প্রমাণযোগ্য একটি সম্পত্তি হতে দিন । তারপর কুই (Y) প্রতিপাদ্য হওয়া উচিত জন্য বস্তু Y টাইপ S যেখানে এস একটি উপপ্রকার হয় টি ।
সুতরাং রুবিতে, উদাহরণস্বরূপ,
class T; end
class S < T; end
এই ফর্মটিতে এলএসপি লঙ্ঘন করুন, যেমন Q (x) = দ্বারা সম্পত্তি হিসাবে দেখা হয়েছেx.class.name == 'T'
যোগ. যদি উত্তরটি "হ্যাঁ" হয় (অন্তর্দর্শনের সাথে এলএসপি বেমানান), তবে আমার অন্য প্রশ্নটি হ'ল: এলএসপির এমন কিছু সংশোধিত "দুর্বল" রূপ রয়েছে যা সম্ভবত গতিশীল ভাষার জন্য থাকতে পারে, সম্ভবত কিছু অতিরিক্ত শর্তে এবং কেবলমাত্র বিশেষ ধরণের সাথে এর বৈশিষ্ট্য ।
হালনাগাদ. রেফারেন্সের জন্য, এখানে ওয়েবে আমি খুঁজে পেয়েছি এলএসপির আরও একটি সূত্র:
বেস ক্লাসে পয়েন্টার বা রেফারেন্স ব্যবহার করে এমন ফাংশনগুলি অজান্তেই উত্পন্ন ক্লাসের অবজেক্টগুলি ব্যবহার করতে সক্ষম হতে হবে।
এবং অন্য:
যদি এস টি টি-এর ঘোষিত উপ-টাইপ হয়, তবে টাইপ এস-এর অবজেক্টগুলি টি-এর টাইপের অবজেক্ট হিসাবে আচরণ করা উচিত, যদি তারা টি টাইপের বস্তু হিসাবে বিবেচনা করা হয় if
শেষটি এটিকে টিকা দেওয়া হয়:
লক্ষ করুন যে এলএসপি হ'ল বস্তুর প্রত্যাশিত আচরণ সম্পর্কে। কেউ কেবলমাত্র এলএসপিকে অনুসরণ করতে পারে যদি কেউ অবজেক্টগুলির প্রত্যাশিত আচরণ কী তা সম্পর্কে পরিষ্কার থাকে।
এটি আসলটির চেয়ে দুর্বল বলে মনে হচ্ছে এবং এটি পর্যবেক্ষণ করা সম্ভব হতে পারে তবে আমি এটিকে আনুষ্ঠানিকভাবে দেখতে চাই, বিশেষত ব্যাখ্যা করা হয়েছিল যে প্রত্যাশিত আচরণটি কী তা কে সিদ্ধান্ত নেয়।
তাহলে কি এলএসপি কোনও প্রোগ্রামিং ভাষায় একজোড়া শ্রেণীর সম্পত্তি নয়, পূর্বপুরুষ শ্রেণীর দ্বারা সন্তুষ্ট একটি নির্দিষ্ট সংস্থার সাথে একত্রে ক্লাসের এক জোড়া? ব্যবহারিকভাবে, এর অর্থ কি এলএসপিকে সম্মান করে একটি সাবক্লাস (বংশধর শ্রেণি) তৈরি করতে পূর্বপুরুষের সমস্ত সম্ভাব্য ব্যবহারগুলি জানা থাকতে হবে? এলএসপির মতে পূর্বপুরুষের বর্গটি কোনও বংশধর শ্রেণীর সাথে প্রতিস্থাপনযোগ্য হওয়ার কথা, তাই না?
হালনাগাদ. আমি ইতিমধ্যে উত্তরটি স্বীকার করে নিয়েছি, তবে আমি প্রশ্নটি বর্ণনা করার জন্য রুবি থেকে আরও একটি দৃ concrete় উদাহরণ যুক্ত করতে চাই। রুবিতে, প্রতিটি শ্রেণি এই অর্থে একটি মডিউল যা Class
ক্লাস বর্গের বংশধর Module
। যাহোক:
class C; end
C.is_a?(Module) # => true
C.class # => Class
Class.superclass # => Module
module M; end
M.class # => Module
o = Object.new
o.extend(M) # ok
o.extend(C) # => TypeError: wrong argument type Class (expected Module)