কোন শ্রেণীর তার সাবক্লাস সম্পর্কে জানতে হবে? একটি শ্রেণীর উদাহরণস্বরূপ প্রদত্ত সাবক্লাসের জন্য নির্দিষ্ট কিছু করা উচিত?
আমার প্রবৃত্তিগুলি আমাকে বলে যে এটি একটি খারাপ নকশা, এটি কোনও ধরণের বিরোধী-প্যাটার্নের মতো বলে মনে হচ্ছে।
কোন শ্রেণীর তার সাবক্লাস সম্পর্কে জানতে হবে? একটি শ্রেণীর উদাহরণস্বরূপ প্রদত্ত সাবক্লাসের জন্য নির্দিষ্ট কিছু করা উচিত?
আমার প্রবৃত্তিগুলি আমাকে বলে যে এটি একটি খারাপ নকশা, এটি কোনও ধরণের বিরোধী-প্যাটার্নের মতো বলে মনে হচ্ছে।
উত্তর:
ক্লাসগুলির ধারণার দ্বারা বোঝানো উত্তরটি হ'ল "না"।
হয় আপনি যে কোনও পদক্ষেপ, ডেটা বা সম্পর্ক পরিচালনা করছেন তা হ'ল সমস্ত সাবক্লাসের অংশ - তবে এটি প্রকৃত প্রকারটি পরীক্ষা না করেই সুপারক্লাসে পরিচালনা করা উচিত। বা এটি কেবলমাত্র কিছু সাবক্লাসে প্রযোজ্য - তারপরে সঠিক কাজটি করার জন্য আপনাকে রান-টাইম ধরণের চেক করতে হবে, যখনই অন্য কেউ উত্তরাধিকার সূত্রে আসে তখনই সুপারক্লাসটি পরিবর্তন করতে হবে (অথবা এটি নিঃশব্দে ভুল কাজটি করতে পারে), উদ্ভূত শ্রেণীর পরিবর্তনগুলি অপরিবর্তিত সুপারক্লাস, ইত্যাদি ভাঙতে পারে etc.
সংক্ষেপে, আপনি বেশ কয়েকটি খারাপ পরিণতি পান যা সাধারণত এই জাতীয় সমাধানগুলি হাতছাড়া করে দেওয়ার পক্ষে যথেষ্ট খারাপ। যদি আপনার বেশ কয়েকটি সাবক্লাস একই কাজ করে এবং আপনি কোড সদৃশতা এড়াতে চান (কার্যত সর্বদা একটি ভাল জিনিস), তবে একটি ভাল সমাধান একটি মধ্য স্তরের শ্রেণি প্রবর্তন করা উচিত যা থেকে এই সমস্ত সাবক্লাস কোডটির উত্তরাধিকারী হতে পারে।
এটি না শুধুমাত্র জানা উচিত , এটি সহজভাবে না ! সাধারণত, যে কোনও সময়, যে কোনও সময় কোনও শ্রেণি বাড়ানো যেতে পারে। এটা তোলে শ্রেণীর যে এমনকি করা হয়নি দ্বারা বাড়ানো যেতে পারে অস্তিত্ব যখন এটি লেখা হয়েছিল।
কিছু ভাষাগুলি বর্ধিত ক্লাসগুলিকে সুপারক্লাস দ্বারা নিয়ন্ত্রিত করার অনুমতি দেয়। স্কালায়, একটি শ্রেণিকে চিহ্নিত করা যায় sealed
, যার অর্থ এটি একই সংকলন ইউনিটের (উত্স ফাইল) মধ্যে অন্যান্য শ্রেণি দ্বারা প্রসারিত দ্বারা করা যেতে পারে । যাইহোক, যদি না সেই উপশ্রেণী হয় এছাড়াও sealed
বা final
, উপশ্রেণী তারপর আরও অন্য ক্লাসের দ্বারা বাড়ানো যেতে পারে।
স্কালায়, এটি বদ্ধ বীজগণিত ডেটা ধরণের মডেল করতে ব্যবহৃত হয়, সুতরাং প্রথাগত হাস্কেল List
প্রকার:
data List a = Nil | Cons a (List a)
স্কালায় এভাবে মডেল করা যায়:
sealed trait List[+A]
case object Nil extends List[Nothing]
final case class Cons[+A] extends List[A]
আর তুমি যে নিশ্চিত করতে পারে না শুধুমাত্র ঐ দুই উপ-"ক্লাস" বিদ্যমান কারণ List
হয় sealed
এবং এইভাবে ফাইলের বর্ধিত বাহিরে হতে পারে না, Cons
হয় final
এবং এইভাবে সব সময়ে বাড়ানো যাবে না এবং Nil
একটি হয় object
যা যাহাই হউক না কেন বাড়ানো যাবে না।
তবে এটি একটি নির্দিষ্ট ব্যবহারের কেস (উত্তরাধিকারের মাধ্যমে বীজগণিত ডেটা ধরণের মডেলিং) এবং এমনকি এই ক্ষেত্রে, সুপারক্লাসটি আসলে তার সাবক্লাসগুলি সম্পর্কে জানে না। এই ধরণের ব্যবহারকারীর পক্ষে এটি আরও গ্যারান্টিযুক্ত List
যে তিনি যদি কেসকে বৈষম্যমূলক আচরণ করেন Nil
এবং তার পিছনে পিছনে অন্যCons
কোনও বিকল্প থাকবে না ।
abstract internal
সদস্যের কিছু রূপ যুক্ত করে ।
সহজ উত্তরটি হ'ল না No.
এটি কোড ভঙ্গুর করে তোলে এবং অবজেক্ট অরিয়েন্টেড প্রোগ্রামিংয়ের দুটি মূল নীতিকে ভায়োলেট করে।
হ্যা মাঝেমাঝে. উদাহরণস্বরূপ, যখন সীমিত সংখ্যক সাবক্লাস উপস্থিত থাকে। একজন পরিদর্শক প্যাটার্ন এই পদ্ধতির উপযোগিতা একজন চিত্রণ।
উদাহরণ: কিছু ভাল-সংজ্ঞায়িত ব্যাকরণের একটি বিমূর্ত সিনট্যাক্স ট্রি (এএসটি) নোডগুলি Node
সমস্ত নোডের প্রকারগুলি পরিচালনা করতে দর্শনার্থী প্যাটার্ন প্রয়োগ করে একক শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে ।
Node
ক্লাসে অবশ্যই এর সাবক্লাসের কোনও সরাসরি উল্লেখ নেই। তবে এতে প্যারামিটার accept
সহ একটি পদ্ধতি রয়েছে Visitor
। এবং প্রতিটি সাবক্লাস প্রতি Visitor
একটি visit
পদ্ধতি রয়েছে । সুতরাং, Node
এর সাবক্লাসের সরাসরি কোনও রেফারেন্স না থাকলেও Visitor
ইন্টারফেসের মাধ্যমে পরোক্ষভাবে তাদের সম্পর্কে এটি "জানে" । তারা সকলেই এর মাধ্যমে একত্রে মিলিত হয়েছিল।
আমি যদি ফার্মের জন্য কোনও উপাদান লিখি এবং পরে, আমি চলে যাওয়ার পরে, কেউ নিজের উদ্দেশ্যে এটি বাড়িয়ে দেয় তবে আমাকে সে সম্পর্কে অবহিত করা উচিত?
না!
ক্লাস সঙ্গে একই। আপনার প্রবৃত্তি বিশ্বাস।