জাভাতে ওভারলোডিং ও ওভাররাইড উভয়ের ক্ষেত্রে যে কাজগুলি সমবায়তা এবং বৈপরীত্য প্রদর্শন করে তার উদাহরণ দিন? [বন্ধ]


105

জাভাতে সামঞ্জস্যতা এবং বৈপরীত্যের জন্য দয়া করে একটি ভাল উদাহরণ দেখান।

উত্তর:


155

সহভেদাংক:

class Super {
  Object getSomething(){}
}
class Sub extends Super {
  String getSomething() {}
}

সাব # গেটসোমিং কিছুটা সমবায়ীয় কারণ এটি সুপার # গেটসোমথিংয়ের রিটার্ন টাইপের একটি সাবক্লাস প্রদান করে (তবে সুপার.গেটসোমিংথিং () এর চুক্তিটি পূর্ণ পূরণ করে)

Contravariance

class Super{
  void doSomething(String parameter)
}
class Sub extends Super{
  void doSomething(Object parameter)
}

সাব # ডোসোমিংটি বিপরীত কারণ এটি সুপার # ডসোসমিংয়ের প্যারামিটারের একটি সুপারক্লাসের প্যারামিটার নেয় (তবে, আবার সুপার # ডসোসমিংয়ের চুক্তিটি পূর্ণ করে তোলে)

বিজ্ঞপ্তি: এই উদাহরণটি জাভাতে কাজ করে না। জাভা সংকলক ওভারলোড করবে এবং doSomething () - পদ্ধতিকে ওভাররাইড করবে না। অন্যান্য ভাষা এই শৈলীর বিপরীতে সমর্থন করে।

জেনেরিক্স

জেনারিক্সের পক্ষে এটিও সম্ভব:

List<String> aList...
List<? extends Object> covariantList = aList;
List<? super String> contravariantList = aList;

আপনি এখন covariantListসেই সমস্ত পদ্ধতিতে অ্যাক্সেস করতে পারেন যা জেনেরিক প্যারামিটার গ্রহণ করে না (যেমন এটি অবশ্যই "অবজেক্ট অবজেক্ট" হতে পারে) তবে গ্রাহকরা ভাল কাজ করবে (যেমন প্রত্যাবর্তিত বস্তু সর্বদা "অবজেক্ট" টাইপের হবে)

বিপরীতটি সত্য contravariantList: আপনি জেনেরিক প্যারামিটারগুলির সাহায্যে সমস্ত পদ্ধতি অ্যাক্সেস করতে পারেন (আপনি এটি জানেন যে এটি অবশ্যই "স্ট্রিং" এর একটি সুপারক্লাস হতে হবে, যাতে আপনি সর্বদা একটি পাস করতে পারেন), তবে কোনও গেটর নেই (প্রত্যাবর্তিত প্রকারটি স্ট্রিংয়ের অন্য কোনও সুপার টাইপের হতে পারে) )


79
বিপরীতে প্রথম উদাহরণ জাভাতে কাজ করে না। সাব ক্লাসে doSomething () হ'ল একটি ওভারলোড, ওভাররাইড নয়।
ক্রেগ পি মোটলিন

15
প্রকৃতপক্ষে. জাভা সাব টাইপিংয়ে বিপরীত যুক্তিকে সমর্থন করে না। কী উদ্বেগের পদ্ধতিটি রিটার্নের ধরণের (প্রথম উদাহরণের মতো) কেবল সেই বিষয়গুলির জন্য কেবল অসঙ্গতি।
the_dark_destructor

দুর্দান্ত উত্তর। Covariance আমার কাছে যৌক্তিক দেখায়। তবে আপনি কি আমাকে জেএলএসে একটি অনুচ্ছেদ নির্দেশ করতে পারেন যা বিপরীতে বর্ণনা করে? সাব.ডোসোমিংয়ের জন্য কেন অনুরোধ করা হচ্ছে?
মিখাইল

2
ক্রেগ যেমন উল্লেখ করেছেন, তেমনটি নয়। আমি মনে করি যে এখানে ওভাররাইডিং এবং ওভারলোডিংয়ের মধ্যে সংঘাত রয়েছে এবং এসইএন পশ্চাদপদ-সামঞ্জস্যপূর্ণ বিকল্পটি পছন্দ করেছে (বরাবরের মতো)। সুতরাং জাভাতে আপনি কোনও পদ্ধতিকে ওভাররাইড করার সময় বিপরীতমুখী পরামিতি ব্যবহার করতে পারবেন না।
হার্ডকোডেড

1
আমি কেন আমার উত্তরের জন্য ডাউনটি পেয়েছি তা জানতে পেরে ভাল লাগবে।
হার্ডকোড

48

কো-ভেরিয়েন্স: আইটেবল এবং আইট্রেটার। এটি প্রায়শই সহ-বৈকল্পিক Iterableবা সংজ্ঞা দেওয়ার জন্য অর্থবোধ করে IteratorIterator<? extends T>ঠিক তেমন ব্যবহার করা যেতে পারে Iterator<T>- প্যারামিটার টাইপ করার একমাত্র জায়গাটি nextপদ্ধতি থেকে রিটার্নের ধরণ , তাই এটি নিরাপদে আপ-কাস্ট করা যেতে পারে T। তবে আপনার যদি Sপ্রসারিত হয় তবে আপনি বিভিন্ন ধরণের ভেরিয়েবলকেও Tবরাদ্দ করতে পারেন । উদাহরণস্বরূপ আপনি যদি একটি সন্ধানের পদ্ধতিটি সংজ্ঞায়িত করছেন:Iterator<S>Iterator<? extends T>

boolean find(Iterable<Object> where, Object what)

আপনি এটির সাথে কল করতে সক্ষম হবেন না List<Integer>এবং এটি আরও 5ভাল হিসাবে সংজ্ঞায়িত করা হয়েছে

boolean find(Iterable<?> where, Object what)

বৈসাদৃশ্য: তুলনামূলক। এটি প্রায়শই ব্যবহার করার জন্য বুদ্ধি করে Comparator<? super T>, কারণ এটি ঠিক যেমন ব্যবহার করা যায় Comparator<T>। প্রকারের প্যারামিটারটি কেবল compareপদ্ধতি প্যারামিটারের प्रकार হিসাবে উপস্থিত হয় , তাই Tএটি নিরাপদে প্রেরণ করা যায়। উদাহরণস্বরূপ, যদি আপনার একটি থাকে DateComparator implements Comparator<java.util.Date> { ... }এবং আপনি List<java.sql.Date>সেই তুলকটির সাথে একটি সাজানোর ( java.sql.Dateএকটি উপ-শ্রেণি java.util.Date) চান তবে আপনি এটি করতে পারেন:

<T> void sort(List<T> what, Comparator<? super T> how)

কিন্তু সাথে না

<T> void sort(List<T> what, Comparator<T> how)

-4

Liskov প্রতিকল্পন নীতি । ফলস্বরূপ, যদি ক্লাস বি শ্রেণি A এর প্রসারিত করে তবে যখনই A এর দরকার হয় আপনার বি ব্যবহার করতে সক্ষম হবেন।


6
এটি প্রশ্নের উত্তর দিচ্ছে না এবং বিভ্রান্ত করছে। শব্দাবলীর যথার্থতা ভঙ্গ করে এবং তাই এলএসপিকে লঙ্ঘন করে এমন একটি বৈকল্পিক সিস্টেম ডিজাইন করা পুরোপুরি সম্ভব হবে।
ম্যাট হুইপল

এটি contra variantবলার মতো ঘটনা নয় । super.doSomething("String")দ্বারা প্রতিস্থাপন করা যায়নি sub.doSomething(Object)
10'7 এ জিংক করা হচ্ছে

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