জাভা বিমূর্ত ইন্টারফেস


197

একটি উদাহরণ বিবেচনা করুন (যা জাভা সংকলন)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}

কেন একটি ইন্টারফেসের বিমূর্ততা "ঘোষিত" করা প্রয়োজন? বিমূর্ত ইন্টারফেসের সাথে প্রযোজ্য এমন অন্যান্য বিধি রয়েছে কি?


শেষ অবধি: যদি abstractঅপ্রচলিত হয় তবে কেন এটি জাভার অন্তর্ভুক্ত? বিমূর্ত ইন্টারফেসের জন্য কোনও ইতিহাস আছে?



5
" অবশেষে: .... " অংশ বিবেচনা করে একটি সদৃশ নয় ।
আইয়ুব

এই সম্পর্কিত প্রশ্ন একটি বাস্তব উদাহরণ উদ্ধৃতি stackoverflow.com/questions/4380796/...
Raedwald

1
এবং যখন আপনি 'ইন্টারফেস এক্সট্রাক্ট' করবেন তখন ডিফল্টরূপে কেন গ্রহপঞ্জ 'বিমূর্ত' যুক্ত করে?
ModdyFire

@ মোডিফায়ার, দয়া করে বিস্তারিত বলবেন?
বুহাকে সিন্ধি

উত্তর:


447

কেন একটি ইন্টারফেসের বিমূর্ততা "ঘোষিত" করা প্রয়োজন?

এটা না।

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}

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

বিমূর্ত ইন্টারফেসের সাথে প্রযোজ্য এমন অন্যান্য বিধি রয়েছে কি?

না, একই বিধি প্রযোজ্য। পদ্ধতিটি যে কোনও (কংক্রিট) প্রয়োগকারী শ্রেণীর দ্বারা প্রয়োগ করতে হবে।

যদি বিমূর্তটি অপ্রচলিত হয় তবে এটি জাভাতে অন্তর্ভুক্ত করা হবে কেন? বিমূর্ত ইন্টারফেসের জন্য কোনও ইতিহাস আছে?

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

ঠিক আছে, আরও খনন করে ... অসংখ্য ভাঙা লিঙ্কগুলি আঘাত করার পরে, আমি মূল ওক ০.২ স্পেসিফিকেশন (বা "ম্যানুয়াল") এর একটি অনুলিপি খুঁজে পেতে সক্ষম হয়েছি । বেশ আকর্ষণীয় পড়া আমি অবশ্যই বলতে হবে, এবং মোট 38 পৃষ্ঠা! :-)

বিভাগ 5, ইন্টারফেসের অধীনে, এটি নিম্নলিখিত উদাহরণ সরবরাহ করে:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

এবং মার্জিনে এটি বলে

ভবিষ্যতে, ইন্টারফেসগুলিতে ঘোষণার পদ্ধতিগুলির "= 0" অংশটি চলে যেতে পারে।

মূলশব্দটি =0প্রতিস্থাপন করে ধরে abstractনিলাম, আমি সন্দেহ করি যে abstractইন্টারফেস পদ্ধতির জন্য কোনও এক সময় বাধ্যতামূলক ছিল!


সম্পর্কিত নিবন্ধ: জাভা: বিমূর্ত ইন্টারফেস এবং বিমূর্ত ইন্টারফেস পদ্ধতি


3
কিন্তু বিমূর্তি নিজেই অচল নয়, নাকি? এটি ইন্টারফেসের জন্য অপ্রচলিত তবে এখনও বিমূর্ত ক্লাস এবং পদ্ধতি রয়েছে।
ব্যবহারকারী 85421

ধন্যবাদ ;-) আমি মনে করি অবশেষে abstractইন্টারফেস পদ্ধতির সামনে অনুমতি দেওয়ার জন্য আমি উত্সটিকে পেরেক দিয়েছি ।
আইয়ুব

13
কি দারুন. সুতরাং এটি "ডিজাইনের মাধ্যমে" অপ্রচলিত। এই জেএলএস ডিজাইনাররা সত্যই সর্বদা কিছু ভাঙ্গতে ভয় পেয়েছিল এমনকি এমন কিছু ভাঙা যা কখনও প্রকাশিত হয় নি ... :-)
লুকাশ এডার

@ আইয়ুব, আপনি অবশ্যই গুগল ওয়েব ক্রলার হবেন যা আমরা জানিনা ... লোল
বুহাকে সিন্ধি

18
BTW। একটি ইন্টারফেস ঘোষণার পদ্ধতিগুলিতে "পাবলিক" প্রয়োজন হয় না ... সেগুলি সর্বদা সর্বজনীন।
rec

37

publicইন্টারফেসের পদ্ধতিগুলির মতো এটি প্রয়োজনীয় নয়, এটি methodsচ্ছিক।

এটিতে জেএলএস দেখুন:

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1 বিমূর্ত ইন্টারফেস প্রতিটি ইন্টারফেস সুস্পষ্টভাবে বিমূর্ত। এই সংশোধকটি অপ্রচলিত এবং নতুন প্রোগ্রামগুলিতে ব্যবহার করা উচিত নয়।

এবং

9.4 বিমূর্ত পদ্ধতি ঘোষণা

[...]

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

ইন্টারফেসের পদ্ধতিগুলির জন্য জনসাধারণের পরিবর্তনকারীকে অতিরিক্তভাবে নির্দিষ্ট করার জন্য এটি অনুমোদিত তবে স্টাইলের বিষয় হিসাবে দৃ strongly়ভাবে নিরুৎসাহিত।


7
জেএলএস-এর কাছে: একে একে একে একে একই অর্থ এবং প্রায় একে অপরের পাশে প্রায় নির্ভুল শব্দ সহ অপ্রয়োজনীয়ভাবে দুটি বাক্য রচনা করার জন্য শৈলীর বিষয় হিসাবে
দৃ

11

ইন্টারফেসটি বিমূর্ত ঘোষণা করার প্রয়োজন নেই।

ঠিক সেই সমস্ত পদ্ধতি જાહેર করার মতো (যা তারা ইতিমধ্যে ইন্টারফেসটি সর্বজনীন হলে) বা বিমূর্ত (যা তারা ইতিমধ্যে একটি ইন্টারফেসে রয়েছে) অপ্রয়োজনীয়।

যদিও কেউ আপনাকে বাধা দিচ্ছে না।

আপনি স্পষ্টভাবে বলতে পারেন এমন অন্যান্য জিনিস, তবে এর দরকার নেই:

  • কনস্ট্রাক্টরের প্রথম লাইনে সুপার () কল করুন
  • extends Object
  • উত্তরাধিকারসূত্রে প্রাপ্ত ইন্টারফেস প্রয়োগ করুন

বিমূর্ত ইন্টারফেসের সাথে প্রযোজ্য এমন অন্যান্য বিধি রয়েছে কি?

একটি ইন্টারফেস ইতিমধ্যে "বিমূর্ত"। সেই কীওয়ার্ডটি আবার প্রয়োগ করা একেবারেই কোনও পার্থক্য করে না।


2
স্পষ্টতই, পদ্ধতিগুলি এমনকি সর্বজনীন যদি ইন্টারফেস নিজেই প্যাকেজ-ব্যক্তিগত হয়।
থিলো

7

সচেতন থাকুন যে বসন্তে এটির একাডেমিক অর্থ নেই। বিমূর্ত ইন্টারফেসটি বিকাশকারীকে এটি ব্যবহার না করার জন্য একটি সতর্কতা @Autowired। আমি আশা করি বসন্ত / @Autowiredগ্রহণ এই বৈশিষ্ট্যটি দেখবে এবং এর ব্যবহার সম্পর্কে সতর্ক / ব্যর্থ হবে।

একটি প্রকৃত উদাহরণ: @ সার্ভিস প্রক্সি @ ট্রান্স ন্যাশনাল একটি @ রিপোসিটোরির কাছে একই বেসিক পদ্ধতিগুলি ব্যবহার করা দরকার তবে তাদের এই বিমূর্ত ইন্টারফেসটি ব্যবহার করা উচিত যা কারণে এই বিমূর্ত ইন্টারফেসটি প্রসারিত করে @Autowired। (আমি এই XXXSpec ইন্টারফেস কল)


+1 ভাল হিট, আমি অ-প্যাসিভেটেবল সেশনবিন ইনজেকশনগুলির বিচ্ছিন্নতার জন্য বিস্তৃতভাবে চেয়েছিলাম। হয়ত আমি কোনও নিয়মের জন্য ফাইন্ডব্যাগ / চেকস্টাইল ব্যবহার করতে পারি ....
গ্রিম

3

প্রতিটি ইন্টারফেস সুস্পষ্টভাবে বিমূর্ত।
এই সংশোধকটি অপ্রচলিত এবং নতুন প্রোগ্রামগুলিতে ব্যবহার করা উচিত নয়।

[জাভা ভাষার উল্লেখ - 9.1.1.1 abstractইন্টারফেস]

এছাড়াও নোট করুন যে ইন্টারফেস সদস্য পদ্ধতিগুলি অন্তর্নিহিত public abstract
[জাভা ভাষার নির্দিষ্টকরণ - 9.2 ইন্টারফেস সদস্যগণ]

এই সংশোধকরা কেন অন্তর্নিহিত? এখানে অন্য কোনও সংশোধক (এমনকি ' কোনও সংশোধক ' -মডিফায়ারও নয়) নেই যা কার্যকর হবে, সুতরাং আপনাকে স্পষ্টভাবে এটি টাইপ করতে হবে না।



2

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


-2

একটি বিমূর্ত ইন্টারফেসটি ততটাই তাত্ক্ষণিকভাবে বলছে বলে মনে হয় না।

একটি ইন্টারফেস প্রসারিত করা যেতে পারে, ঠিক যেমন একটি ক্লাস পারে। আপনি যদি আপনার অ্যাপ্লিকেশনটির জন্য একটি ইন্টারফেস হায়ারার্কি ডিজাইন করেন তবে আপনার 'বেস' ইন্টারফেসটি থাকতে পারে, আপনি অন্য ইন্টারফেসগুলি প্রসারিত করেন তবে নিজেই কোনও অবজেক্ট হিসাবে চান না।

উদাহরণ:

public abstract interface MyBaseInterface {
    public String getName();
}

public interface MyBoat extends MyBaseInterface {
    public String getMastSize();
}

public interface MyDog extends MyBaseInterface {
    public long tinsOfFoodPerDay();
}

আপনি আমার ক্লাসটি মাইবেসআইন্টারফেসটি প্রয়োগ করতে চান না, কেবল অন্য দুটি, এমএমডোগ এবং মাইবোট, তবে উভয় ইন্টারফেসই মাইবেসইন্টারফেস ইন্টারফেস ভাগ করে, তাই একটি 'নাম' বৈশিষ্ট্য রয়েছে।

আমি এর কিন্ডা একাডেমিক জানি, তবে আমি ভেবেছিলাম কারও কারও কাছে এটি আকর্ষণীয় হতে পারে। :-)

এই ক্ষেত্রে এটি কেবলমাত্র একটি 'মার্কার', এটি ইন্টারফেসের বাস্তবায়নকারীদের ইঙ্গিত দেওয়ার জন্য এটি নিজস্বভাবে প্রয়োগ করার জন্য ডিজাইন করা হয়নি। আমার একটি সংকলকটি নির্দেশ করা উচিত (কমপক্ষে সূর্য / ওরে 1.6 আমি এটি দিয়ে চেষ্টা করেছি) এমন একটি ক্লাস সংকলন করে যা একটি বিমূর্ত ইন্টারফেস প্রয়োগ করে।


3
আমি বিশ্বাস করি আপনি আমার প্রশ্নটি পুরোপুরি ভুল বুঝেছেন।
বুহাকে সিন্ধি

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

-3

ওয়েল 'অ্যাবস্ট্রাক্ট ইন্টারফেস' একটি লিক্সিকাল কনস্ট্রাক্ট: http://en.wikedia.org/wiki/Lexical_analysis

এটি সংকলক দ্বারা প্রয়োজনীয়, আপনি লিখতে পারে interface

ভাষাটির লেক্সিকাল কাঠামো সম্পর্কে খুব বেশি কিছু পাবেন না কারণ তারা সংকলন প্রক্রিয়া চলাকালীন বা কিছু পশ্চাদপদ সামঞ্জস্যের জন্য বিশেষ ক্ষেত্রে হিসাবে বিবেচিত কিছু সংকলনের অস্পষ্টতা সমাধানের জন্য এটি সেখানে রেখেছিলেন, মূল লেক্সিকাল কাঠামোয় ফোকাস করার চেষ্টা করুন।

`ইন্টারফেসের সারমর্মটি হ'ল কিছু বিমূর্ত ধারণা (ধারণা / চিন্তা / উচ্চতর আদেশের চিন্তাভাবনা ইত্যাদি) ক্যাপচার করা যার বাস্তবায়ন পরিবর্তিত হতে পারে ... অর্থাৎ একাধিক বাস্তবায়ন হতে পারে।

একটি ইন্টারফেস হ'ল একটি বিশুদ্ধ বিমূর্ত ডেটা টাইপ যা অবজেক্টের ক্যাপচার বা প্রতিনিধিত্ব করে তার বৈশিষ্ট্যগুলি উপস্থাপন করে।

বৈশিষ্ট্যগুলি স্থান বা সময় দ্বারা উপস্থাপন করা যেতে পারে। যখন তারা স্থান (মেমরি স্টোরেজ) দ্বারা প্রতিনিধিত্ব করা হয় এর অর্থ হ'ল আপনার কংক্রিট শ্রেণি একটি ক্ষেত্র এবং পদ্ধতি / পদ্ধতিগুলি প্রয়োগ করবে যা সেই ক্ষেত্রটিতে বা সময়ক্রমে পরিচালিত হবে যার অর্থ বৈশিষ্ট্যটি বাস্তবায়নের কাজটি সম্পূর্ণরূপে গণনামূলক (আরও সিপিইউ ক্লক প্রয়োজন প্রক্রিয়াজাতকরণের জন্য) যাতে আপনার বৈশিষ্ট্য বাস্তবায়নের জন্য স্থান এবং সময়ের মধ্যে বাণিজ্য বন্ধ থাকে।

যদি আপনার কংক্রিট শ্রেণি সমস্ত বৈশিষ্ট্য প্রয়োগ করে না তবে এটি আবার বিমূর্ত হয়ে ওঠে কারণ আপনার নিজের ধারণা বা ধারণা বা বিমূর্ততার একটি বাস্তবায়ন রয়েছে তবে এটি সম্পূর্ণ নয়, আপনি এটি abstractশ্রেণি দ্বারা নির্দিষ্ট করে ।

একটি কংক্রিট শ্রেণি ক্লাসের একটি শ্রেণি / সেট হবে যা আপনি XYZ শ্রেণিতে ক্যাপচার করার চেষ্টা করছেন এমন বিমূর্ততা পুরোপুরি ক্যাপচার করবে।

প্যাটার্ন হয়

Interface--->Abstract class/Abstract classes(depends)-->Concrete class

1
এই উত্তরটি আমার প্রশ্নের মোটেই উত্তর দেয় না। এছাড়াও "It seams like you are new to Java। সত্যি?
বুহাকে সিন্ধি


(1) "বিমূর্ত অপ্রচলিত" -> যদি তারা এটিকে সরিয়ে দেয় এবং সংকলক এটি সনাক্ত করা বন্ধ করে দেয় তবে "অ্যাবস্ট্রাক্ট ইন্টারফেস" ব্যবহার করে সোর্স কোডের পূর্ববর্তী সংস্করণটি আরও নতুন সংস্করণে সংকলন করবে না They তাদের পশ্চাদপটে সামঞ্জস্যতা বজায় রাখা দরকার। আপনি যখন বিমূর্ত ইন্টারফেসটি সংজ্ঞায়িত করেন তখন ইন্টারফেস কীওয়ার্ডটির অর্থ এটি "অ্যাবস্ট্রাক্ট" এর সাথে আটকে যায় যা আপনার মতো অভিজ্ঞ প্রোগ্রামারদের শর্টকাট "ইন্টারফেস" সরবরাহ করে তবে এটি আপনার প্রশ্নের অনুরূপ i = i + 1 == > আমি ++ .. পছন্দ আপনি যা পছন্দ করেন তা আপনার: ডি
মণীশ

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

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