কখন ব্যবহার করবেন: জাভা 8+ ইন্টারফেসের ডিফল্ট পদ্ধতি, বনাম বিমূর্ত পদ্ধতি


540

জাভা 8 ইন্টারফেস নামক পদ্ধতির ডিফল্ট বাস্তবায়ন জন্য করতে পারবেন ডিফল্ট পদ্ধতি

আমি কখন (এই ) এর interface default methodপরিবর্তে এই ধরণের ব্যবহার করব তার মধ্যে আমি বিভ্রান্ত ।abstract classabstract method(s)

সুতরাং কখন ডিফল্ট পদ্ধতি সহ ইন্টারফেস ব্যবহার করা উচিত এবং কখন একটি বিমূর্ত শ্রেণি (বিমূর্ত পদ্ধতি (গুলি) সহ ব্যবহার করা উচিত? বিমূর্ত ক্লাসগুলি এখনও সেই দৃশ্যে কার্যকর?


38
ইন্টারফেসে আপনার এখনও ক্ষেত্র, ব্যক্তিগত পদ্ধতি ইত্যাদি থাকতে পারে না, যখন আপনি বিমূর্ত ক্লাসে করতে পারেন?
sp00m

2
আমি আগে এই বিষয়টি নিয়ে ভাবছিলাম, এখন আমি পরিষ্কার @ @ নরেন্দ্র পাঠাইকে ধন্যবাদ। আমি একই বিষয়ে আপনার দ্বারা জিজ্ঞাসা করা অন্য থ্রেডের লিঙ্ক যুক্ত করতে চাই, কারণ এই দুটিই আমার সন্দেহ ছিল। stackoverflow.com/questions/19998309/…
আশুতোষ রঞ্জন

আপনি এখানে এটির
Fabri Pautasso

বেস ক্লাসের স্টেট থাকলেও আপনি মাঝে মাঝে একটি বেস ক্লাসটিকে ইন্টারফেস হিসাবে কোড করতে পারেন। এটি কেবলমাত্র ইন্টারফেসের জন্য রাষ্ট্রের জন্য সেটার এবং গেটার সংজ্ঞায়িত করতে হবে এবং কংক্রিট শ্রেণিগুলি তাদের বাস্তবায়ন করতে হবে এবং ক্ষেত্রটি নির্ধারণ করতে হবে। এর উপর একটি বিধিনিষেধ হ'ল একটি বিমূর্ত শ্রেণিতে শিমের সম্পত্তি ব্যক্তিগত বা সুরক্ষিত হতে পারে। ইন্টারফেসে কেবল সর্বজনীন পদ্ধতি রয়েছে। সুতরাং আপনি একটি বিমূর্ত বেস ক্লাসটি ব্যবহার করার একটি কারণ হ'ল যদি আপনার ক্লাসগুলির এমন কোনও সম্পত্তি থাকে যা ব্যক্তিগত বা সুরক্ষিত হওয়া দরকার।
ডাব্লিক

@ ড্যাব্লিক আপনি হ্যাশম্যাপের মাধ্যমে কোনও ইন্টারফেসে রাষ্ট্রীয় সমস্যা সমাধান করতে পারেন নি? উদাহরণস্বরূপ: আপনি যদি ক্লাস Foo চান যা ইনট, বি, স্ট্রিং সি রাখে c এবং আপনি তাদের রাজ্য রাখতে চান, একটি ফু-অজানা * / স্ট্রিংয়ের / / ক্ষেত্রের মানচিত্র * / হাশম্যাপ </ * নাম নির্দিষ্ট ক্ষেত্র * / স্ট্রিং, / ক্ষেত্রের মান * / অবজেক্ট >> মানচিত্রের একটি হ্যাশম্যাপ তৈরি করুন । আপনি যখন তাত্ত্বিক শ্রেণীর ফু ফু "ইনস্ট্যান্ট" করতে চান, আপনার কাছে পদ্ধতি, ইনস্ট্যান্টিয়েট (স্ট্রিং নেম অফফু) থাকে যা ম্যাপ.পুট (nameOfFoo, ক্ষেত্র) যেখানে ক্ষেত্রগুলি হ্যাশম্যাপ <স্ট্রিং, অবজেক্ট> ফিল্ডস.পুট ("একটি", নতুন iNT ( "5")); ক্ষেত্র.পুট ("বি", নতুন ইনট ("6")); ক্ষেত্র.পুট ("সি", "ব্লাহ"));
জর্জ জাভিয়ার

উত্তর:


307

ডিফল্ট পদ্ধতি প্রয়োগের (যেমন বেসরকারী রাষ্ট্র) এর চেয়ে বিমূর্ত ক্লাসগুলির আরও অনেক কিছু রয়েছে, তবে জাভা 8 হিসাবে যখনই আপনার কোনও পছন্দ আছে, আপনার defaultইন্টারফেসে ডিফেন্ডার (ওরফে ) পদ্ধতির সাথে যেতে হবে ।

ডিফল্ট পদ্ধতির সীমাবদ্ধতা হ'ল এটি কেবলমাত্র অন্য ইন্টারফেস পদ্ধতিতে কলগুলির শর্তাদিতে প্রয়োগ করা যেতে পারে, নির্দিষ্ট প্রয়োগের অবস্থার কোনও উল্লেখ নেই। সুতরাং প্রধান ব্যবহারের ক্ষেত্রে উচ্চ-স্তরের এবং সুবিধার পদ্ধতি convenience

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

defaultজাভা 8-তে পদ্ধতিগুলি প্রবর্তনের মূল প্রেরণা ছিল কোনও বিদ্যমান বাস্তবায়ন ভঙ্গ না করে ল্যাম্বদা-ভিত্তিক পদ্ধতির সাথে সংগ্রহ ফ্রেমওয়ার্ক ইন্টারফেসগুলি বাড়ানোর ইচ্ছা ছিল desire যদিও এটি পাবলিক লাইব্রেরিগুলির লেখকদের জন্য আরও প্রাসঙ্গিক, আপনি একই প্রকল্পটি আপনার প্রকল্পেও দরকারী হিসাবে পেতে পারেন। আপনি একটি নতুন কেন্দ্রে স্থান পেয়েছেন যেখানে নতুন সুবিধা যুক্ত করা যায় এবং বাকি ধরণের শ্রেণিবদ্ধতা কীভাবে দেখায় তার উপর নির্ভর করতে হবে না।


34
এই যুক্তি দ্বারা, তারা পরবর্তী জিনিসটি যুক্ত করবে তা হ'ল ডিফল্ট পদ্ধতিতে ঘোষণা। আমি এখনও এ সম্পর্কে অনিশ্চিত, বৈশিষ্ট্যটি আমার কাছে হ্যাকের মতো মনে হয় যা অপব্যবহারের জন্য সবার সামনে প্রকাশ করা হচ্ছে।
প্যান্থার

3
জাভা 8 যুগের একমাত্র অ্যাবস্ট্রাক্ট ক্লাসের ব্যবহার যা আমি দেখতে পাচ্ছি তা হ'ল চূড়ান্ত ক্ষেত্রগুলি নির্ধারণ করার জন্য। ইন্টারফেসে ক্ষেত্রগুলি ডিফল্টভাবে চূড়ান্ত হয় তাই আপনি যখন তাদের অর্পণ করেন তবে আপনি সেগুলি পরিবর্তন করতে পারবেন না।
অনুরোপ

7
@ অ্যানুরূপ কেবলমাত্র ডিফল্টরূপে নয় --- এটিই একমাত্র বিকল্প। ইন্টারফেসগুলি উদাহরণস্বরূপ স্থিতি ঘোষণা করতে পারে না, এজন্য বিমূর্ত ক্লাসগুলি এখানে থাকার জন্য রয়েছে।
মার্কো টপলনিক

2
@ ফিলিপরেগো অ্যাবস্ট্রাক্ট পদ্ধতিগুলি কোনও কল করে না কারণ তাদের কোন প্রয়োগ নেই। কোনও শ্রেণিতে প্রয়োগ করা পদ্ধতিগুলি শ্রেণীর রাজ্যে অ্যাক্সেস করতে পারে (উদাহরণের ভেরিয়েবল)। ইন্টারফেসগুলি এটিকে ঘোষণা করতে পারে না তাই ডিফল্ট পদ্ধতিগুলি সেগুলি অ্যাক্সেস করতে পারে না। রাজ্যে অ্যাক্সেস করে এমন একটি বাস্তবায়িত পদ্ধতি সরবরাহ করে তাদের শ্রেণীর উপর নির্ভর করতে হবে।
মার্কো টপলনিক

2
মার্কো টপলনিক, আপনার উত্তরটি মারা গেছে। তবে আমি আপনার উত্তরের একটি আপডেট সুপারিশ করতে চাই। আপনি যুক্ত করতে পারেন যে ডিফল্ট পদ্ধতির সৌন্দর্যটি হ'ল, যদি ইন্টারফেসটি নতুন ডিফল্ট পদ্ধতি যুক্ত করে তবে আপনার সেই ইন্টারফেসটির পূর্ববর্তী প্রয়োগটি ভাঙ্গবে না। জাভা 8-এর আগে এটি সত্য ছিল না
hfontanez

125

কয়েকটি প্রযুক্তিগত পার্থক্য রয়েছে। জাভা 8 ইন্টারফেসের তুলনায় বিমূর্ত শ্রেণিগুলি এখনও আরও কিছু করতে পারে:

  1. বিমূর্ত শ্রেণিতে একটি কনস্ট্রাক্টর থাকতে পারে can
  2. বিমূর্ত শ্রেণিগুলি আরও কাঠামোগত এবং একটি রাষ্ট্র ধরে রাখতে পারে।

ধারণামূলকভাবে, জাভা 8-এ নতুন বৈশিষ্ট্য (ল্যাম্বডা-ফাংশন হিসাবে) প্রবর্তনের পরে ডিফেন্ডার পদ্ধতির মূল উদ্দেশ্য একটি পশ্চাদপটে সামঞ্জস্যতা।


20
এই উত্তরটি আসলে সঠিক এবং বিশেষত "ধারণা হিসাবে, ডিফেন্ডার পদ্ধতির মূল উদ্দেশ্য একটি পশ্চাদপটে সামঞ্জস্যতা"
চেষ্টা করা হচ্ছে

1
@ অজানা এই পৃষ্ঠাটি আরও অন্তর্দৃষ্টি দেয়: ডকস.ওরকল
জাভাস

@ অজানা, মূলত এটি আপনাকে ইন্টারফেসে এমন পদ্ধতি এবং ক্লাসগুলি সংযুক্ত করে যা ইন্টারফেসটি স্বয়ংক্রিয়ভাবে কার্যকর করে দেয় ality
কিংবদন্তি লেন্থথ

3
নং পয়েন্ট সম্পর্কে আরও সূক্ষ্ম বিন্দু। উপরে "2 টি ধরে রাখতে পারে এটি হ'ল" above বিমূর্ত ক্লাসগুলি রাষ্ট্র ধরে রাখতে পারে যা পরে পরিবর্তিত হতে পারে। ইন্টারফেসগুলিও রাষ্ট্র ধরে রাখতে পারে তবে উদাহরণস্বরূপ সৃষ্টির পরে কোনও রাষ্ট্রকে অর্পণ করা হলে রাষ্ট্র পরিবর্তন করা যায় না।
অনুরোপ

3
@ অ্যানরোপ আমি কোনও public static finalইন্টারফেসের ক্ষেত্রগুলিকে "রাষ্ট্র" হিসাবে বর্ণনা করি না । staticঅংশ মানে যে সব একটি নির্দিষ্ট উদাহরণস্বরূপ এর সাথে সম্পর্কিত নয় জীবনধারা। তারা শ্রেণি ইনস্ট্যান্টেশন উপর অর্পিত হয় , যা উদাহরণস্বরূপ সৃষ্টির পরে একই নয় ।
জেরোনিমো

65

এটি এই নিবন্ধে বর্ণিত হচ্ছে । forEachসংগ্রহ সম্পর্কে চিন্তা করুন ।

List<?> list = 
list.forEach(…);

ForEach এখনও দ্বারা java.util.Listবা java.util.Collectionইন্টারফেস দ্বারা ঘোষণা করা হয়নি। একটি সুস্পষ্ট সমাধান হ'ল বিদ্যমান ইন্টারফেসে নতুন পদ্ধতি যুক্ত করা এবং জেডিকে যেখানে প্রয়োজন সেখানে বাস্তবায়ন সরবরাহ করা। তবে, একবার প্রকাশিত হলে বিদ্যমান প্রয়োগটি ভঙ্গ না করে ইন্টারফেসে পদ্ধতি যুক্ত করা অসম্ভব।

ডিফল্ট পদ্ধতিগুলি যে সুবিধাটি নিয়ে আসে তা হ'ল ইন্টারফেসে এখন একটি নতুন ডিফল্ট পদ্ধতি যুক্ত করা সম্ভব এবং এটি প্রয়োগগুলি ভঙ্গ করে না।


1
'বিদ্যমান বাস্তবায়ন ভঙ্গ না করে ইন্টারফেসে পদ্ধতি যুক্ত করা অসম্ভব' - তাই না?
আন্দ্রে চাশেভ

26
@ অ্যান্ড্রেচ্যাসেভ আপনি যদি ইন্টারফেসে একটি নতুন পদ্ধতি যুক্ত করেন তবে সমস্ত প্রয়োগকারীদের অবশ্যই সেই নতুন পদ্ধতিটি প্রয়োগ করতে হবে। সুতরাং এটি বিদ্যমান বাস্তবায়নগুলি ভঙ্গ করে।
মার্কো টপলনিক

4
@ মারকো টপলনিক ধন্যবাদ, এটি মিস করেছেন। কেবলমাত্র উল্লেখ করার জন্য এটি আংশিকভাবে এড়ানোর একটি উপায় রয়েছে - একটি ডিফল্ট বিমূর্ত প্রয়োগের ক্ষেত্রে এই পদ্ধতিটি উপস্থাপন করে। এই উদাহরণস্বরূপ এটি AbstractList::forEachএকটি নিক্ষেপ করা হবে UnsupportedOperationException
আন্দ্রে চাশেভেভ

3
@ আন্ড্রেচাচেভ হ্যাঁ, এটি ছিল পুরানো উপায় (খিহম ... বর্তমান পথ :) :) এর অভাব যে এটি প্রয়োগকারীকে প্রদত্ত বিমূর্ত বাস্তবায়ন থেকে একক উত্তরাধিকারে সীমাবদ্ধ করে।
মার্কো তোপোলনিক

সময়ের আগে যদি এমনটি ঘটে থাকে তবে আমি ভাঙ্গব না, সমস্ত বাস্তবায়নে সেই পদ্ধতিটি অন্তর্ভুক্ত ছিল। যা অসম্ভব তবে সম্ভব।
জর্জ জাভিয়ার

19

এই দুটি বেশ আলাদা:

ডিফল্ট পদ্ধতিগুলি হ'ল বিদ্যমান শ্রেণিতে তাদের রাষ্ট্র পরিবর্তন না করে বাহ্যিক কার্যকারিতা যুক্ত করা।

এবং বিমূর্ত ক্লাসগুলি হ'ল একটি সাধারণ ধরণের উত্তরাধিকার, এগুলি হ'ল সাধারণ শ্রেণি যা প্রসারিত করার উদ্দেশ্যে।


18

এই নিবন্ধে বর্ণিত হিসাবে ,

জাভা 8-এ অ্যাবস্ট্রাক্ট ক্লাস বনাম ইন্টারফেস

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

বিমূর্ত শ্রেণি নির্মাতাকে সংজ্ঞায়িত করতে পারে। তারা আরও কাঠামোগত এবং তাদের সাথে একটি রাজ্য যুক্ত থাকতে পারে। বিপরীতে, ডিফল্ট পদ্ধতিটি কেবলমাত্র অন্য ইন্টারফেস পদ্ধতিতে প্রয়োগের ক্ষেত্রে প্রয়োগ করা যেতে পারে, নির্দিষ্ট প্রয়োগের অবস্থার কোনও উল্লেখ নেই। অতএব, উভয়ই বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয় এবং দুটির মধ্যে বেছে নেওয়া সত্যই দৃশ্যের প্রসঙ্গে।


আমি বিশ্বাস করি অ্যাবস্ট্রাক্ট ক্লাসে কনস্ট্রাক্টর রয়েছে যা ইন্টারফেসের বিপরীতে সংজ্ঞায়িত করা যায়। জাভা 8 এও তারা উভয় একে অপরের থেকে এই কারণে পৃথক।
হেমন্ত পিলা

1
এটি যদি তাত্ক্ষণিকভাবে চালু করা না যায় তবে কেন একটি বিমূর্ত শ্রেণীর একজন কনস্ট্রাক্টর থাকে?
জর্জি জেভিয়ার

আমরা চাইল্ড ক্লাস থেকে সুপার () কল করতে পারি যা অ্যাবস্ট্রাক্ট ক্লাসের কনস্ট্রাক্টরকে কল করবে his এটি বিমূর্ত শ্রেণির অবস্থাকে প্রভাবিত করে।
সুজয় মোহন

14

আপনার প্রশ্ন সম্পর্কিত

সুতরাং কখন ডিফল্ট পদ্ধতির সাথে ইন্টারফেস ব্যবহার করা উচিত এবং কখন একটি বিমূর্ত শ্রেণি ব্যবহার করা উচিত? বিমূর্ত ক্লাসগুলি এখনও সেই দৃশ্যে কার্যকর?

জাভা ডকুমেন্টেশন নিখুঁত উত্তর সরবরাহ করে।

ইন্টারফেসের তুলনায় বিমূর্ত শ্রেণি:

বিমূর্ত ক্লাস ইন্টারফেস অনুরূপ। আপনি এগুলি ইনস্ট্যান্ট করতে পারবেন না এবং এগুলিতে কোনও প্রয়োগের সাথে বা ছাড়াই ঘোষিত পদ্ধতিগুলির মিশ্রণ থাকতে পারে।

তবে বিমূর্ত ক্লাসগুলির সাহায্যে আপনি এমন ক্ষেত্রগুলি ঘোষণা করতে পারেন যা স্থির এবং চূড়ান্ত নয় এবং জনসাধারণ, সুরক্ষিত এবং ব্যক্তিগত কংক্রিটের পদ্ধতিগুলি সংজ্ঞায়িত করতে পারে।

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

তাদের প্রত্যেকের জন্য ব্যবহারের কেসগুলি এসই পোস্টের নীচে ব্যাখ্যা করা হয়েছে:

একটি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্য কী?

বিমূর্ত ক্লাসগুলি এখনও সেই দৃশ্যে কার্যকর?

হ্যাঁ. তারা এখনও দরকারী। তারা অ স্ট্যাটিক, অ-ফাইনাল পদ্ধতি থাকতে পারে এবং বৈশিষ্ট্যাবলী ( সংরক্ষিত, পাবলিক ছাড়াও ব্যক্তিগত ), যা এমনকি জাভা-8 ইন্টারফেস সহ সম্ভব নয়।


এখন ইন্টারফেসের ব্যক্তিগত পদ্ধতিগুলিও রয়েছে howtodoinjava.com/java9/java9-private-interface-methods
ভালিজোন

13

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

  1. ডিফল্ট পদ্ধতিগুলি ইন্টারফেসের ক্লাসিক প্যাটার্ন এবং একটি সহযোগী শ্রেণীর অবসান ঘটিয়েছে যা সেই ইন্টারফেসের বেশিরভাগ বা সমস্ত পদ্ধতি প্রয়োগ করে। একটি উদাহরণ Collection and AbstractCollection। এখন আমাদের ডিফল্ট কার্যকারিতা সরবরাহ করার জন্য ইন্টারফেসের নিজস্ব পদ্ধতিগুলি প্রয়োগ করা উচিত। ইন্টারফেস প্রয়োগকারী ক্লাসগুলির পদ্ধতিগুলিকে ওভাররাইড করার বা ডিফল্ট প্রয়োগের উত্তরাধিকারী হওয়ার পছন্দ রয়েছে।
  2. ডিফল্ট পদ্ধতিগুলির আরেকটি গুরুত্বপূর্ণ ব্যবহার হ'ল interface evolution। ধরুন আমার ক্লাস বল যেমন ছিল:

    public class Ball implements Collection { ... }

এখন জাভা 8-এ একটি নতুন বৈশিষ্ট্য প্রবর্তিত হয়েছে। streamইন্টারফেসে যুক্ত পদ্ধতি ব্যবহার করে আমরা একটি স্ট্রিম পেতে পারি । যদি streamডিফল্ট পদ্ধতি না হয় তবে Collectionইন্টারফেসের জন্য সমস্ত বাস্তবায়নগুলি ভেঙে যেত কারণ তারা এই নতুন পদ্ধতিটি প্রয়োগ করে না implementing একটি ইন্টারফেসে একটি অ-ডিফল্ট পদ্ধতি যুক্ত করা হয় না source-compatible

তবে ধরুন আমরা ক্লাসটি পুনরায় সংকলন করে না এবং একটি পুরানো জার ফাইল ব্যবহার করি যা এই ক্লাসটি ধারণ করে Ball। ক্লাসটি এই অনুপস্থিত পদ্ধতি ব্যতীত সূক্ষ্ম লোড করবে, উদাহরণগুলি তৈরি করা যেতে পারে এবং মনে হয় সবকিছু ঠিকঠাক চলছে। কিন্তু প্রোগ্রামের অনুরোধে যদি streamপদ্ধতিটি পাওয়া যায় তবে Ballআমরা পেয়ে যাব AbstractMethodError। সুতরাং পদ্ধতিটি ডিফল্ট তৈরি করা উভয় সমস্যার সমাধান করে।


9

জাভা ইন্টারফেসে ডিফল্ট পদ্ধতি ইন্টারফেস বিবর্তন সক্ষম করে

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

একটি স্ট্যাটিক পদ্ধতি একটি শ্রেণীর জন্য অনন্য। ডিফল্ট পদ্ধতিটি শ্রেণীর উদাহরণের জন্য স্বতন্ত্র।

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

  • ডিফল্ট পদ্ধতিটি প্রয়োগ করে এবং এটি প্রয়োগকৃত ইন্টারফেসে প্রয়োগকে ওভাররাইড করে।
  • পদ্ধতিটি (বাস্তবায়ন ছাড়াই) পুনরায় ঘোষণা করুন যা এটি বিমূর্ত করে তোলে।
  • কিছুই করবেন না (তবে বাস্তবায়িত ইন্টারফেস থেকে ডিফল্ট পদ্ধতিটি কেবল উত্তরাধিকার সূত্রে প্রাপ্ত হয়)।

বিষয়ে আরো এখানে


7

যদিও এটি একটি পুরানো প্রশ্ন আমাকে এর উপর আমার ইনপুটটিও দিতে দিন।

  1. বিমূর্ত শ্রেণি: বিমূর্ত শ্রেণীর অভ্যন্তরে আমরা উদাহরণের ভেরিয়েবলগুলি ঘোষণা করতে পারি, যা শিশু শ্রেণির জন্য প্রয়োজনীয়

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

  2. বিমূর্ত শ্রেণি: বিমূর্ত শ্রেণি বস্তুর অবস্থা সম্পর্কে কথা বলতে পারে

    ইন্টারফেস: ইন্টারফেস কখনও কখনও বস্তুর অবস্থা সম্পর্কে কথা বলতে পারে না

  3. বিমূর্ত শ্রেণি: বিমূর্ত শ্রেণীর অভ্যন্তরে আমরা নির্মাণকারী ঘোষণা করতে পারি

    ইন্টারফেস: ইন্টারফেসের অভ্যন্তরে আমরা কনস্ট্রাক্টরকে ঘোষণা করতে পারি না কারণ কনস্ট্রাক্টরের উদ্দেশ্য
    হ'ল ভেরিয়েবলকে আরম্ভ করা। সুতরাং সেখানে কনস্ট্রাক্টরের দরকার কী যদি আমাদের ইন্টারফেসগুলিতে উদাহরণ ভেরিয়েবল না থাকে

  4. বিমূর্ত শ্রেণি: বিমূর্ত শ্রেণীর অভ্যন্তরে আমরা উদাহরণ এবং স্ট্যাটিক ব্লক ঘোষণা করতে পারি

    ইন্টারফেস: ইন্টারফেসের উদাহরণ এবং স্থির ব্লক থাকতে পারে না।

  5. বিমূর্ত শ্রেণি: বিমূর্ত শ্রেণি ল্যাম্বডা অভিব্যক্তি উল্লেখ করতে পারে না

    ইন্টারফেস: একক বিমূর্ত পদ্ধতি সহ ইন্টারফেসগুলি ল্যাম্বডা এক্সপ্রেশনকে উল্লেখ করতে পারে

  6. বিমূর্ত শ্রেণি : বিমূর্ত শ্রেণীর অভ্যন্তরে আমরা OBJECT CLASS পদ্ধতিগুলি ওভাররাইড করতে পারি

    ইন্টারফেস: আমরা ইন্টারফেসের মধ্যে OBJECT CLASS পদ্ধতিগুলি ওভাররাইড করতে পারি না।

আমি এই নোটটিতে শেষ করব:

ইন্টারফেসে ডিফল্ট পদ্ধতি ধারণাগুলি / স্থিতিশীল পদ্ধতি ধারণাগুলি কেবল বাস্তবায়ন ক্লাসগুলি সংরক্ষণ করতে এসেছিল তবে অর্থবহ কার্যকর কার্যকরকরণ সরবরাহ করতে নয়। ডিফল্ট পদ্ধতি / স্থিতিশীল পদ্ধতি হ'ল এক ধরণের ডামি বাস্তবায়ন, "আপনি যদি চান তবে আপনি এগুলি ব্যবহার করতে পারেন বা প্রয়োগকারী ক্লাসে এগুলি (ডিফল্ট পদ্ধতিগুলির ক্ষেত্রে) ওভাররাইড করতে পারেন" সুতরাং যখনই ইন্টারফেসে নতুন পদ্ধতিগুলি বাস্তবায়ন ক্লাসে নতুন পদ্ধতি প্রয়োগ করা থেকে আমাদের বাঁচায় যোগ করা হয়েছে. সুতরাং ইন্টারফেস কখনও বিমূর্ত ক্লাসের সমান হতে পারে না।


5

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

আপনি পরে কোডটি কার্যকর করার জন্য অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করতে পারেন। এখন জাভা 8 এর সাহায্যে আপনি সরাসরি ইন্টারফেসে এটি করতে পারেন। এটি একটি সুবিধা, না আরও।


2

কখন ডিফল্ট পদ্ধতিতে ইন্টারফেস ব্যবহার করা উচিত এবং কখন একটি বিমূর্ত শ্রেণি ব্যবহার করা উচিত?

পশ্চাদপদ সামঞ্জস্যতা: কল্পনা করুন যে আপনার ইন্টারফেসটি শত শত শ্রেণীর দ্বারা প্রয়োগ করা হয়েছে, সেই ইন্টারফেসটি সংশোধন করা সমস্ত ব্যবহারকারীদের সদ্য যুক্ত হওয়া পদ্ধতিটি প্রয়োগ করতে বাধ্য করবে, যদিও এটি আপনার ইন্টারফেসটি প্রয়োগ করে এমন অন্যান্য শ্রেণীর জন্য প্রয়োজনীয় নাও হতে পারে, এটি আপনার ইন্টারফেসকে অনুমতি দেয় একটি ক্রিয়ামূলক ইন্টারফেস হতে

তথ্য ও বিধিনিষেধ:

1-মে শুধুমাত্র একটি ইন্টারফেসের মধ্যে ঘোষণা করা হয় কোনও শ্রেণি বা বিমূর্ত শ্রেণীর মধ্যে নয়।

2-একটি শরীর সরবরাহ করা আবশ্যক

3-এটি কোনও ইন্টারফেসে ব্যবহৃত অন্যান্য সাধারণ পদ্ধতি হিসাবে বিমূর্ত বলে ধরে নেওয়া হয় না।


1

জাভা 8-তে একটি ইন্টারফেস একটি বিমূর্ত শ্রেণীর মতো দেখায় যদিও তাদের কিছু পার্থক্য হতে পারে যেমন:

1) বিমূর্ত শ্রেণি ক্লাস, তাই এটি জাভাতে ইন্টারফেসের অন্যান্য বিধিনিষেধের মধ্যে সীমাবদ্ধ নয় যেমন অ্যাবস্ট্রাক্ট শ্রেণিতে রাষ্ট্র থাকতে পারে তবে জাভাতে ইন্টারফেসে আপনার রাষ্ট্র থাকতে পারে না।

২) ডিফল্ট পদ্ধতি এবং বিমূর্ত শ্রেণীর সাথে ইন্টারফেসের মধ্যে আরেকটি অর্থগত পার্থক্য হ'ল আপনি একটি বিমূর্ত শ্রেণীর অভ্যন্তরে কনস্ট্রাক্টরকে সংজ্ঞায়িত করতে পারেন তবে জাভাতে ইন্টারফেসের ভিতরে কনস্ট্রাক্টর সংজ্ঞায়িত করতে পারবেন না


আমি # 2 এর সাথে একমত কিন্তু # 1 এর জন্য, আপনি কেবল ইন্টারফেসটি বাস্তবায়ন করতে পারবেন না এবং বাস্তবায়ন শ্রেণীর মাধ্যমে একটি রাষ্ট্র রাখতে পারবেন না?
জর্জি জেভিয়ার

0

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

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


0

অন্যান্য উত্তরে উল্লিখিত হিসাবে, সংগ্রহের কাঠামোর পিছনে সামঞ্জস্যতা প্রদানের জন্য একটি ইন্টারফেসে প্রয়োগকরণ যুক্ত করার ক্ষমতা যুক্ত করা হয়েছিল। আমি যুক্তি দিয়ে বলব যে একটি ইন্টারফেসে বাস্তবায়ন যুক্ত করার পিছনে সামঞ্জস্যতা সরবরাহ করা একমাত্র সম্ভাব্য কারণ।

অন্যথায়, আপনি যদি কোনও ইন্টারফেসে বাস্তবায়ন যুক্ত করেন তবে ইন্টারফেসটি কেন প্রথম স্থানে যুক্ত করা হয়েছিল তার জন্য আপনি মৌলিক আইনটি ভঙ্গ করছেন। জাভা একক উত্তরাধিকারের ভাষা, সি ++ এর বিপরীতে যা একাধিক উত্তরাধিকারের অনুমতি দেয়। ইন্টারফেসগুলি টাইপিং সুবিধাগুলি সরবরাহ করে যা এমন ভাষার সাথে আসে যা একাধিক উত্তরাধিকার নিয়ে আসা সমস্যাগুলির পরিচয় না দিয়ে একাধিক উত্তরাধিকারকে সমর্থন করে।

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

class MyObject extends String implements Runnable, Comparable { ... }

MyObject কেবলমাত্র একটি বাস্তবায়ন উত্তরাধিকার সূত্রে প্রাপ্ত, তবে এটি উত্তরাধিকারসূত্রে তিনটি চুক্তি।

জাভা বাস্তবায়নের একাধিক উত্তরাধিকার নিয়েছে কারণ বাস্তবায়নের একাধিক উত্তরাধিকার প্রচুর কাঁটা সমস্যার সাথে আসে, যা এই উত্তরের ক্ষেত্রের বাইরে। বাস্তবায়নের একাধিক উত্তরাধিকারের সমস্যা ছাড়াই চুক্তির একাধিক উত্তরাধিকার (ওরফে ইন্টারফেস) অনুমোদনের জন্য ইন্টারফেস যুক্ত করা হয়েছিল।

আমার বক্তব্যকে সমর্থন করার জন্য, কেন আর্নল্ড ও জেমস গোসলিংয়ের জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ, চতুর্থ সংস্করণ বইয়ের একটি উদ্ধৃতি দেওয়া হয়েছে :

একক উত্তরাধিকার কিছু দরকারী এবং সঠিক ডিজাইন অন্তর্ভুক্ত। একাধিক উত্তরাধিকারের সমস্যাগুলি বাস্তবায়নের একাধিক উত্তরাধিকার থেকে উদ্ভূত হয়, তবে বেশিরভাগ ক্ষেত্রে বহু বিস্তৃত চুক্তি এবং সম্ভবত একটি কংক্রিটের বাস্তবায়নের জন্য একাধিক উত্তরাধিকার ব্যবহৃত হয়। কোনও বাস্তবায়নের উত্তরাধিকার ছাড়াই একটি বিমূর্ত চুক্তির উত্তরাধিকারী হওয়ার উপায় সরবরাহ করা একাধিক বাস্তবায়নের উত্তরাধিকারের সমস্যা ছাড়াই একাধিক উত্তরাধিকারের টাইপিং সুবিধার অনুমতি দেয় allows বিমূর্ত চুক্তির উত্তরাধিকারকে ইন্টারফেসের উত্তরাধিকার বলে অভিহিত করা হয় । জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ আপনাকে কোনও interfaceধরণের ঘোষণার অনুমতি দিয়ে ইন্টারফেস উত্তরাধিকার সমর্থন করে


-1

মুক্ত / বদ্ধ নীতিটি প্রথমে ভাবেন। ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি এটিকে ঘুরান। এটি জাভাতে একটি খারাপ বৈশিষ্ট্য। এটি খারাপ ডিজাইন, খারাপ আর্কিটেকচার, স্বল্প সফ্টওয়্যার মানের উত্সাহ দেয়। আমি পুরোপুরি ডিফল্ট পদ্ধতি ব্যবহার এড়াতে পরামর্শ দেব।

নিজেকে কয়েকটি প্রশ্ন জিজ্ঞাসা করুন: আপনি কেন আপনার পদ্ধতিগুলি বিমূর্ত শ্রেণিতে রাখতে পারবেন না? আপনি কি একাধিক বিমূর্ত ক্লাসের প্রয়োজন? তারপরে আপনার ক্লাস কী জন্য দায়বদ্ধ তা ভেবে দেখুন। আপনি কি নিশ্চিত যে একা ক্লাসে আপনি যে পদ্ধতি প্রয়োগ করতে যাচ্ছেন সেগুলি একই উদ্দেশ্য পূরণ করে? হতে পারে আপনি বেশ কয়েকটি উদ্দেশ্যে আলাদা করতে পারবেন এবং তারপরে প্রতিটি শ্রেণীর জন্য নিজের শ্রেণিটি বিভিন্ন শ্রেণিতে বিভক্ত হবে।

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