যখন আমরা একটি বিমূর্ত শ্রেণি থেকে উত্তরাধিকার সূত্রে একটি বর্গ তৈরি করি এবং যখন আমরা উত্তরাধিকারসূত্রে বিমূর্ত শ্রেণীর প্রয়োগ করি তখন আমাদের কেন ওভাররাইড কীওয়ার্ডটি ব্যবহার করতে হবে?
"কেন?" এ জাতীয় প্রশ্নের উত্তর দেওয়া শক্ত কারণ তারা অস্পষ্ট। আমি ধরে নিতে চলেছি যে আপনার প্রশ্নটি " overrideকীওয়ার্ডের প্রয়োজনীয় অবস্থানের জন্য তত্ক্ষণাত ভাষা ডিজাইনের সময় কী যুক্তি দেওয়া যেতে পারে ?"
একটি পদক্ষেপ পিছনে নিয়ে শুরু করা যাক। কিছু ভাষায়, জাভা বলুন, পদ্ধতিগুলি ডিফল্টরূপে ভার্চুয়াল এবং স্বয়ংক্রিয়ভাবে ওভাররাইড হয়ে যায়। সি # এর ডিজাইনাররা এটি সম্পর্কে সচেতন ছিলেন এবং এটি জাভাতে একটি ছোটখাটো ত্রুটি হিসাবে বিবেচনা করেছিলেন। সি # "বোকা অংশগুলি নিয়ে জাভা নয় " যেমনটি কিছু বলেছেন, তবে সি # এর ডিজাইনাররা সি, সি ++ এবং জাভা সম্পর্কিত সমস্যাযুক্ত ডিজাইন পয়েন্টগুলি থেকে শিখতে আগ্রহী ছিলেন এবং সেগুলিকে সি # তে প্রতিলিপি না দিয়েছিলেন।
সি # ডিজাইনাররা ওভাররাইডিংকে বাগের সম্ভাব্য উত্স হিসাবে বিবেচনা করে; সর্বোপরি, এটি বিদ্যমান, পরীক্ষিত কোডের আচরণ পরিবর্তন করার একটি উপায় এবং এটি বিপজ্জনক। ওভাররাইডিং এমন কিছু নয় যা দুর্ঘটনাক্রমে বা দুর্ঘটনার দ্বারা করা উচিত; এটি সম্পর্কে কঠোর চিন্তা করে কেউ ডিজাইন করা উচিত । এজন্য পদ্ধতিগুলি ডিফল্টরূপে ভার্চুয়াল নয় এবং কেন আপনি কোনও পদ্ধতিকে ওভাররাইড করছেন তা বলার দরকার রয়েছে।
এটিই মূল যুক্তি। আমরা এখন আরও কিছু উন্নত যুক্তিতে যেতে পারি।
স্ট্রিপলিং ওয়ারিয়রের উত্তর আরও উন্নত যুক্তি তৈরি করার ক্ষেত্রে প্রথম কাট দেয়। উদ্ভূত শ্রেণীর লেখক বেস ক্লাস সম্পর্কে অজ্ঞাত থাকতে পারে, একটি নতুন পদ্ধতি তৈরির উদ্দেশ্যে হতে পারে এবং আমাদের ভুল করে ব্যবহারকারীকে ওভাররাইড করার অনুমতি দেওয়া উচিত নয় ।
যদিও এই বিন্দুটি যুক্তিসঙ্গত, তবে বেশ কয়েকটি প্রতিপক্ষ রয়েছে, যেমন:
- একটি উত্পন্ন শ্রেণীর লেখকের বেস ক্লাস সম্পর্কে সমস্ত কিছু জানার দায়িত্ব আছে ! তারা সেই কোডটি পুনরায় ব্যবহার করছে এবং এ কোডটি পুনরায় ব্যবহার করার আগে তাদের এই কোডটি ভালভাবে বুঝতে অনুধাবন করার উচিত।
- আপনার নির্দিষ্ট দৃশ্যে ভার্চুয়াল পদ্ধতিটি বিমূর্ত; এটিকে ওভাররাইড না করা একটি ত্রুটি হবে এবং তাই লেখক দুর্ঘটনাক্রমে কোনও বাস্তবায়ন তৈরি করে এমন সম্ভাবনা কম।
আসুন তাহলে এই বিন্দুতে আরও উন্নত যুক্তি তৈরি করা যাক। বেস ক্লাস কী করে তা না জানার জন্য কোন পরিস্থিতিতে উদ্ভূত শ্রেণীর লেখককে ক্ষমা করা যেতে পারে? ভাল, এই পরিস্থিতিতে বিবেচনা করুন:
- বেস শ্রেণীর লেখক একটি বিমূর্ত বেস ক্লাস বি করেন
- উদ্ভূত শ্রেণীর লেখক, একটি ভিন্ন দলে, পদ্ধতি এম দিয়ে একটি উত্পন্ন ক্লাস ডি তৈরি করে
- বেস ক্লাসের লেখক বুঝতে পেরেছেন যে টিমগুলি বেস ক্লাস বি প্রসারিত করে তাদের সর্বদা একটি পদ্ধতি এম সরবরাহ করা প্রয়োজন, সুতরাং বেস শ্রেণীর লেখক বিমূর্ত পদ্ধতি এম যোগ করে M.
- ক্লাস ডি পুনরায় সংকলিত হয়, তখন কি ঘটে?
আমরা যেটি ঘটতে চাই তা হ'ল ডি এর লেখককে অবহিত করা হয়েছে যে প্রাসঙ্গিক কিছু পরিবর্তিত হয়েছে । প্রাসঙ্গিক জিনিসটি যে পরিবর্তিত হয়েছে তা হ'ল এম এখন একটি প্রয়োজনীয়তা এবং তাদের প্রয়োগ অবশ্যই ওভারলোড করা উচিত। এটি একবার বেস ক্লাস থেকে ডেকে আনা যেতে পারে তা আমরা জানতে পারলে ডিএম এর আচরণ পরিবর্তন করতে পারে। সঠিক কাজটি হ'ল চুপচাপ "ওহ, ডিএম বিদ্যমান এবং বিএম প্রসারিত করে" না বলা say সংকলকটি করার জন্য সঠিক জিনিসটি ব্যর্থ হয়েছে এবং "আরে, ডি লেখক, আপনার এই ধারণাটি যা এখন আর বৈধ নয় তা পরীক্ষা করে দেখুন এবং প্রয়োজনে আপনার কোডটি ঠিক করুন" say
আপনার উদাহরণে, অনুমান করা overrideছিল ঐচ্ছিক উপর SayHelloকারণ এটি একটি বিমূর্ত পদ্ধতি অগ্রাহ্য করা হয়। দুটি সম্ভাবনা রয়েছে: (১) কোডটির লেখক একটি বিমূর্ত পদ্ধতি ওভাররাইড করতে চান, বা (২) ওভাররাইডিং পদ্ধতি দুর্ঘটনার দ্বারা ওভাররাইড হচ্ছে কারণ অন্য কেউ বেস ক্লাস পরিবর্তন করেছে, এবং কোডটি এখন কিছু সূক্ষ্মভাবে ভুল। Theseচ্ছিক হলে overrideআমরা এই সম্ভাবনাগুলি আলাদা করে বলতে পারি না ।
কিন্তু যদি overrideহয় প্রয়োজনীয় তারপর আমরা তিনটি বিশেষ পরিস্থিতিতে বলতে পারেন। যদি কোডে একটি সম্ভাব্য ভুল তারপর overrideহয় অনুপস্থিত । এটা ইচ্ছাকৃতভাবে অগ্রাহ্য করা থাকে তবে overrideহয় বর্তমান । আর এটা যদি ইচ্ছাকৃতভাবে করা হয় না অগ্রাহ্য তারপর newহয় বর্তমান । সি # এর ডিজাইন আমাদের এই সূক্ষ্ম পার্থক্য তৈরি করতে সক্ষম করে।
মনে রাখবেন সংকলক ত্রুটি প্রতিবেদন করার জন্য বিকাশকারীদের মন পড়তে হবে ; সংকলককে অবশ্যই ভুল কোড থেকে অনুমান করতে হবে যে লেখকের মনে সম্ভবত সঠিক কোড ছিল এবং একটি ত্রুটি দেওয়া উচিত যা সেগুলি সঠিক দিক নির্দেশ করে। বিকাশকারীরা কী ভাবছেন সে সম্পর্কে কোডগুলিতে আমরা যত বেশি ক্লু রেখে যেতে পারি, সংকলক ত্রুটিগুলি রিপোর্ট করার ক্ষেত্রে আরও ভাল কাজ করতে পারে এবং তাই আপনি আপনার বাগগুলি খুঁজে পেতে এবং ঠিক করতে পারবেন তত দ্রুত।
তবে আরও সাধারণভাবে, সি # কোডটি পরিবর্তিত করে এমন একটি বিশ্বের জন্য তৈরি করা হয়েছিল । "বিজোড়" প্রদর্শিত সি # এর একটি দুর্দান্ত অনেকগুলি বৈশিষ্ট্য আসলে সেখানে রয়েছে কারণ তারা বিকাশকারীকে অবহিত করে যখন বৈধ হিসাবে ব্যবহৃত অনুমানটি অবৈধ হয়ে গেছে কারণ একটি বেস শ্রেণি পরিবর্তিত হয়েছিল। এই শ্রেণীর বাগগুলিকে "ব্রিটল বেস ক্লাস ব্যর্থতা" বলা হয়, এবং সি # এই ব্যর্থতা শ্রেণীর জন্য বেশ কয়েকটি আকর্ষণীয় প্রশমন রয়েছে।