কেবল রিটার্নের ধরণ পরিবর্তন করে কোনও ফাংশন ওভারলোড করা কেন সম্ভব নয়? জাভা এর ভবিষ্যতের সংস্করণে কি তা পরিবর্তন হবে?
যাইহোক, কেবল রেফারেন্সের জন্য, এটি কি সি ++ এ সম্ভব?
কেবল রিটার্নের ধরণ পরিবর্তন করে কোনও ফাংশন ওভারলোড করা কেন সম্ভব নয়? জাভা এর ভবিষ্যতের সংস্করণে কি তা পরিবর্তন হবে?
যাইহোক, কেবল রেফারেন্সের জন্য, এটি কি সি ++ এ সম্ভব?
উত্তর:
আপনি এটি জাভাতে করতে পারবেন না এবং আপনি এটি সি ++ এও করতে পারবেন না। যৌক্তিকতাটি হ'ল যে ফাংশনটি কল করতে হবে তা নির্ধারণের জন্য কম্পাইলারের জন্য একা রিটার্ন মান যথেষ্ট নয়:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, এটি double
।
foo();
কোনও রিটার্নের ধরণ ছাড়াই অস্পষ্ট হবে তা সত্য নয় যে এটি একটি ওভারলোড হিসাবে অস্বীকার করার কোনও কারণ নয়। এমন যুক্তি রয়েছে যা দ্ব্যর্থহীনতা তৈরি করতে পারে (উদাঃ foo(null);
), তবে এটি ওভারলোডকে সহজাতভাবে অবৈধ করে না।
কারণটি হ'ল জাভাতে ওভারলোডগুলি কেবলমাত্র বিভিন্ন স্বাক্ষরযুক্ত পদ্ধতির জন্য অনুমোদিত ।
রিটার্নের ধরণটি পদ্ধতি স্বাক্ষরের অংশ নয়, সুতরাং ওভারলোডগুলি আলাদা করতে ব্যবহার করা যাবে না।
জাভা টিউটোরিয়ালগুলি থেকে সংজ্ঞায়িত পদ্ধতিগুলি দেখুন ।
calculateAnswer(double, int, double, double)
"। দেখুন যে ফিরতি প্রকারটি অন্তর্ভুক্ত নেই, @ কনমিক।
জাভা 5.0 এর আগে, আপনি যখন কোনও পদ্ধতি ওভাররাইড করবেন, প্যারামিটার এবং রিটার্ন টাইপ উভয়ই ঠিক মিলবে। জাভা 5.0 এ এটি কোভেরিয়েন্ট রিটার্ন টাইপ নামে একটি নতুন সুবিধা প্রবর্তন করেছে। আপনি একই স্বাক্ষর সহ একটি পদ্ধতি ওভাররাইড করতে পারেন তবে প্রত্যাবর্তিত অবজেক্টের একটি সাবক্লাস প্রদান করে। অন্য কথায়, সাবক্লাসের একটি পদ্ধতি এমন কোনও বস্তুকে প্রত্যাবর্তন করতে পারে যার ধরণটি সুপারক্লাসের একই স্বাক্ষর সহ পদ্ধতি দ্বারা ফেরত পাঠানো টাইপের একটি সাবক্লাস।
Overloaded
যুক্তিটিও পৃথক বলে প্রদত্ত জাভা পদ্ধতিতে ভিন্ন ভিন্ন রিটার্নের ধরণ থাকতে পারে।
নমুনা কোডটি দেখুন।
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
কোনও পদ্ধতি ওভারলোড করার সময় রিটার্নের ধরণের বিষয়টি বিবেচনা করে না। আমাদের কেবল কোনও অস্পষ্টতা নিশ্চিত করতে হবে!
আর্গুমেন্ট তালিকার ধরণের পার্থক্য দেখিয়ে জাভা কোন পদ্ধতিতে কল করতে পারে তা জানতে পারে। যদি সংকলক একই নাম এবং একই আর্গুমেন্ট প্রকারের সাথে দুটি পদ্ধতির অনুমতি দেয় তবে এটি কোনটিকে কল করা উচিত তা নির্ধারণের উপায় নেই।
সংযোজনকারী পদ্ধতিগুলি পৃথক করার সময় রিটার্নের ধরণটিকে বিবেচনা করে না, সুতরাং তাদের পৃথক রিটার্নের ধরণ থাকলেও আপনি একই স্বাক্ষর সহ দুটি পদ্ধতি ঘোষণা করতে পারবেন না।
আপনি যদি ফাংশন নির্বাহ সম্পর্কে সচেতন হন তবে আপনি সচেতন হবেন যে যখন আমরা কোনও ফাংশন বলি সংজ্ঞা অংশটি কার্যকর করে এবং শেষ পর্যন্ত আমাদের রিটার্নের বিবৃতি প্রয়োজন, সুতরাং আমরা বলতে পারি যে ফাংশনটির সম্পূর্ণ নির্ধারণের পরে রিটার্ন আসে, তবে কেন সেখানে দুটি হয় বা হয় একই নাম এবং একই ধরণের এবং কোনও সহ আরও ফাংশন। আর্গুমেন্টগুলির পরে কল করার সময় কীভাবে সংকলক জানতে পারে যে কোনটি কল করা উচিত, কারণ ফাংশনের নাম এবং প্যারামিটারগুলি একই। প্রথমে কল করার সময় সমস্ত ফোকাস আর্গুমেন্ট এবং ফাংশন নাম এবং ফাংশন সংজ্ঞা শেষ হওয়ার পরে শেষ পর্যন্ত আমরা রিটার্ন স্টেটমেন্টটি নিয়ে কাজ করব।
কম টাইপ ত্রুটি রান টাইম ত্রুটির চেয়ে ভাল। সুতরাং, আপনি একই পরামিতিগুলি একই পদ্ধতি ঘোষণা করলে জাভা সংকলক সংকলক সময় ত্রুটি রেন্ডার করে।
কোনও তাত্ক্ষণিকভাবে সম্ভব নয় তেমনি আপনি আর্গুমেন্টের বা আর্গুমেন্টের ডেটা ধরণের কোনও দ্বারা কেবল ওভারলোড করতে পারবেন না