উপশ্রেণী বস্তু যেখানে সুপারটাইপ প্রত্যাশিত হিসাবে আর্গুমেন্ট হিসাবে পাস করে ওভাররাইডিং পদ্ধতি


12

আমি কেবল জাভা শিখছি, এবং অনুশীলনকারী প্রোগ্রামার নই।

আমি যে বইটি অনুসরণ করছি তাতে বলা হয়েছে যে কোনও পদ্ধতিকে ওভাররাইড করার সময় আর্গুমেন্টের ধরণগুলি একই রকম হতে পারে তবে রিটার্নের ধরণগুলি বহুবচনগতভাবে সুসংগত হতে পারে।

আমার প্রশ্ন হ'ল কেন ওভাররাইডিং পদ্ধতিতে যুক্তিতর্কগুলি সুপার-টাইপের প্রত্যাশিত সাবক্লাস ধরণের হতে পারে না?

ওভারলোডেড পদ্ধতিতে, আমি যে কোনও পদ্ধতিতে বস্তুটিতে কল করি তা অবশ্যই বস্তুর উপরে সংজ্ঞায়িত হওয়ার গ্যারান্টিযুক্ত।


প্রস্তাবিত সদৃশ উপর নোট:

প্রথম পরামর্শ বর্গ অনুক্রমের এবং যেখানে কার্যকারিতা করা সম্পর্কে উপস্থিত হতে পারে। আমার প্রশ্নটি কেন ভাষা বিধিনিষেধের উপস্থিতিতে আরও বেশি কেন্দ্রীভূত।

দ্বিতীয় প্রস্তাব কিভাবে আমি কি জিজ্ঞেস করছি না, কিন্তু না ব্যাখ্যা কেন যে ভাবে কাজ করতে হবে এটা করেছে। আমার প্রশ্ন কেন কেন্দ্রীভূত।


1
পূর্ববর্তী প্রশ্নের জিজ্ঞাসা ও উত্তর : "এটি সাধারণত লিসকভ সাবস্টিটিউশন প্রিন্সিপাল (এলএসপি) কে ব্যর্থ হিসাবে গণ্য করা হয়, কারণ সংযোজনিত বাধা বলে দেয় যে বেস-ক্লাসের ক্রিয়াকলাপগুলি সর্বদা উপজাত শ্রেণীর পক্ষে উপযুক্ত নয় ..."
জিএনটি

1

@ এই প্রশ্নটি উত্থাপন নয় যে আর্গুমেন্টগুলির জন্য আরও নির্দিষ্ট উপ-প্রকারের প্রয়োজনীয়তা কোনও কম্পিউটারের নীতি লঙ্ঘন করে কিনা, প্রশ্নটি এটি সম্ভব কিনা, যা এডালোরজো উত্তর দিয়েছিল।
user949300

উত্তর:


18

আপনি আপনার প্রশ্নে প্রাথমিকভাবে যে ধারণাটি উল্লেখ করেন সেটিকে কোভেরিয়েন্ট রিটার্ন টাইপ বলা হয় ।

কোভারিয়েন্ট রিটার্ন টাইপগুলি কাজ করে কারণ একটি পদ্ধতিতে নির্দিষ্ট ধরণের কোনও অবজেক্ট ফেরত দেওয়ার কথা বলে এবং ওভাররাইডিং পদ্ধতিগুলি আসলে এটির একটি সাবক্লাস ফিরে আসতে পারে। জাভা মতো ভাষার সাব-টাইপিং নিয়মের ভিত্তিতে, যদি এটির Sএকটি উপ-প্রকার হয় T, তবে যেখানেই Tদেখা যায় আমরা একটি পাস করতে পারি S

যেমনটি Sপ্রত্যাশিত একটি পদ্ধতির ওভাররাইড করে যখন এটি ফেরত দেওয়া নিরাপদ T

ওভাররাইড করা পদ্ধতি দ্বারা অনুরোধ করা সকলের উপপ্রকারগুলি যুক্তিগুলি ব্যবহার করে যে কোনও পদ্ধতি ওভাররাইড করে তা গ্রহণ করার জন্য আপনার পরামর্শটি আরও জটিল কারণ যেহেতু এটি টাইপ সিস্টেমে অনুভূত হয়।

একদিকে, উপরে উল্লিখিত একই সাব-টাইপিং বিধি দ্বারা, সম্ভবত এটি আপনি যা করতে চান তার জন্য ইতিমধ্যে কাজ করে। এই ক্ষেত্রে

interface Hunter {
   public void hunt(Animal animal);
}

এই শ্রেণীর প্রয়োগগুলি কোনও ধরণের প্রাণী গ্রহণ থেকে বাধা দেয় না, কারণ এটি ইতিমধ্যে আপনার প্রশ্নের মানদণ্ডকে সন্তুষ্ট করে।

তবে ধরা যাক আপনার পরামর্শ অনুসারে আমরা এই পদ্ধতিটি ওভাররাইড করতে পারি:

class MammutHunter implements Hunter {
  @Override
  public void hunt(Mammut animal) {
  }
}

মজার অংশটি এখানে, এখন আপনি এটি করতে পারেন:

AnimalHunter hunter = new MammutHunter();
hunter.hunt(new Bear()); //Uh oh

আপনার পাবলিক ইন্টারফেস অনুসারে AnimalHunterআপনার যে কোনও প্রাণীকে শিকার করতে সক্ষম হওয়া উচিত, তবে আপনার প্রয়োগ অনুসারে MammutHunterআপনি কেবলমাত্র Mammutজিনিসগুলি গ্রহণ করেন । অতএব ওভাররডেন পদ্ধতি জনসাধারণের ইন্টারফেসকে সন্তুষ্ট করে না। আমরা এখানে টাইপ সিস্টেমের সাউন্ডনেসটি ভঙ্গ করেছি broke

জেনেরিক ব্যবহার করে আপনি যা চান তা বাস্তবায়ন করতে পারেন।

interface AnimalHunter<T extends Animal> {
   void hunt(T animal);
}

তারপরে আপনি আপনার ম্যামটহান্টার সংজ্ঞায়িত করতে পারেন

class MammutHunter implements AnimalHunter<Mammut> {
   void hunt(Mammut m){
   }
}

এবং জেনেরিক কোভেরিয়েন্স এবং বৈপরীত্য ব্যবহার করে আপনি প্রয়োজনের পরে আপনার পক্ষে নিয়ম শিথিল করতে পারেন। উদাহরণস্বরূপ আমরা নিশ্চিত করতে পারি যে একটি স্তন্যপায়ী শিকারি কেবল প্রদত্ত প্রসঙ্গে কেবল ফাইলেস শিকার করতে পারে:

AnimalHunter<? super Feline> hunter = new MammalHunter();
hunter.hunt(new Lion());
hunter.hunt(new Puma());

ধরা যাক, MammalHunterকার্যকরী AnimalHunter<Mammal>

সেক্ষেত্রে এটি গ্রহণ করা হবে না:

hunter.hunt(new Mammut()):

এমনকি আমরা যখন ম্যামটস স্তন্যপায়ী প্রাণীরাই এটি এখানে ব্যবহার করছি না এমন বৈষম্যমূলক ধরণের বিধিনিষেধের কারণে এটি গ্রহণ করা হবে না। সুতরাং, আপনি এখনও যা উল্লেখ করেছেন তার মতো কাজ করার জন্য ধরণের নিয়ন্ত্রণের জন্য কিছু নিয়ন্ত্রণ রাখতে পারেন।


3

যুক্তি হিসাবে দেওয়া বস্তুটি দিয়ে আপনি ওভাররাইড পদ্ধতিতে যা করেন তা সমস্যা নয়। সমস্যাটি হ'ল কী ধরণের আর্গুমেন্টগুলি আপনার পদ্ধতি ব্যবহার করে কোডটিকে আপনার পদ্ধতিতে ফিড দেওয়ার অনুমতি দেওয়া হয়।

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

আরও নির্দিষ্ট ধরণের আর্গুমেন্ট সহ কোনও পদ্ধতির ওভাররাইডিংকে ওভারলোডিং বলা হয় । এটি একই নামের সাথে তবে একটি ভিন্ন বা আরও নির্দিষ্ট ধরণের যুক্তি সহ একটি পদ্ধতি ব্যাখ্যা করে। মূল পদ্ধতি ছাড়াও একটি ওভারলোডেড পদ্ধতি উপলব্ধ। কোন পদ্ধতিটি বলা হয় তা সংকলন সময়ে পরিচিত ধরণের উপর নির্ভর করে। কোনও পদ্ধতির ওভারলোড করতে আপনাকে @ ওভাররাইড টীকা বাদ দিতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.