ইন্টারফেস প্রয়োগকারী একটি বিমূর্ত শ্রেণি কেন ইন্টারফেসের কোনও পদ্ধতির ঘোষণা / প্রয়োগটি মিস করতে পারে?


123

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

উদাহরণস্বরূপ, ইন্টারফেস দেওয়া:

public interface IAnything {
  void m1();
  void m2();
  void m3();
}

নিম্নলিখিত বিমূর্ত শ্রেণি একটি সতর্কতা বা ত্রুটি ছাড়াই আনন্দিতভাবে সংকলিত হয়:

public abstract class AbstractThing implements IAnything {
  public void m1() {}
  public void m3() {}
}

কেন আপনি ব্যাখ্যা করতে পারেন?


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

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

আপনি যদি অনুরূপ প্রশ্নের জন্য আনোয়ার দেখতে পারেন stackoverflow.com/questions/8026580/...
দো Như গান Vy

উত্তর:


155

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

আপনার উদাহরণ কোড অনুসরণ AbstractThingকরে, m2পদ্ধতিটি প্রয়োগ না করে একটি সাবক্লাস তৈরি করার চেষ্টা করুন এবং সংকলক আপনাকে কী ত্রুটি দেয় তা দেখুন। এটি আপনাকে এই পদ্ধতিটি প্রয়োগ করতে বাধ্য করবে।


1
আমি মনে করি যে সংকলকটি এখনও বিমূর্ত শ্রেণীর বিষয়ে সতর্কতা ফেলে দেওয়া উচিত যা ইন্টারফেস অসম্পূর্ণভাবে প্রয়োগ করে, কেবল তখন আপনাকে সাবক্লাসে কী প্রয়োজন তা দেখার জন্য আপনাকে 1 এর পরিবর্তে 2 শ্রেণির সংজ্ঞাটি দেখতে হবে। যদিও এটি একটি ভাষা / সংকলক সীমাবদ্ধতা।
workmad3

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

4
@ ওয়ার্কমড - আপনার যদি ইন্টারফেস পদ্ধতির একটি উপসেটের জন্য সাধারণ বাস্তবায়ন থাকে তবে এটিকে পৃথক বেস শ্রেণিতে (ডিআরওয়াই এক স্থান-কোড
ট্রাম্পগুলি

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

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

33

পুরোপুরি ঠিক আছে।
আপনি বিমূর্ত ক্লাস ইনস্ট্যান্ট করতে পারবেন না .. তবে বিমূর্ত ক্লাসগুলি এম 1 () এবং এম 3 () এর জন্য সাধারণ বাস্তবায়নগুলি ব্যবহার করতে ব্যবহার করা যেতে পারে।
সুতরাং প্রতিটি প্রয়োগের জন্য যদি এম 2 () বাস্তবায়ন আলাদা তবে এম 1 এবং এম 3 হয় না। আপনি কেবল আলাদা এম 2 প্রয়োগকরণের সাথে বিভিন্ন কংক্রিট আইইনিং বাস্তবায়ন তৈরি করতে পারেন এবং অ্যাবস্ট্রাক্টিং থেকে পেয়েছেন - ডিআরওয়াই নীতিটি সম্মান করে। যদি কোনও বিমূর্ত শ্রেণীর জন্য ইন্টারফেসটি সম্পূর্ণরূপে প্রয়োগ করা হয় তবে যাচাইকরণ ..

আপডেট : আকর্ষণীয়ভাবে, আমি দেখতে পাচ্ছি যে সি # এটি একটি সংকলন ত্রুটি হিসাবে কার্যকর করে। আপনি এই দৃশ্যে অ্যাবস্ট্রাক্ট বেস শ্রেণিতে পদ্ধতির স্বাক্ষরগুলি অনুলিপি করতে এবং তাদের 'অ্যাবস্ট্রাক্ট পাবলিক' দিয়ে উপসর্গ করতে বাধ্য হন .. (প্রতিদিনের জন্য নতুন কিছু :)


7

সেটা ঠিক আছে. উপরেরটি বুঝতে, আপনাকে প্রথমে বিমূর্ত শ্রেণির প্রকৃতি বুঝতে হবে। তারা শ্রদ্ধে ইন্টারফেস অনুরূপ। ওরাকল এখানে এই সম্পর্কে কি বলে ।

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

সুতরাং আপনাকে যখন ভাবতে হবে যে কোনও ইন্টারফেস যখন অন্য ইন্টারফেসটি প্রসারিত করে তখন কী ঘটে। উদাহরণ স্বরূপ ...

//Filename: Sports.java
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

//Filename: Football.java
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

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

আশা করি যে সাহায্য করবে ... এবং আল্লাহু আলাম!


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

... সত্যিই উভয় একটি। তবে একটি বিষয় অবশ্যই নিশ্চিত, সেগুলি অস্থায়ী নয়।
কৃতজ্ঞ

4

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


4

ইন্টারফেস দেওয়া:

public interface IAnything {
  int i;
  void m1();
  void m2();
  void m3();
}

জাভা আসলে এটি দেখায়:

public interface IAnything {
  public static final int i;
  public abstract void m1();
  public abstract void m2();
  public abstract void m3();
}

সুতরাং আপনি এই abstractপদ্ধতিগুলির কিছু (বা সমস্ত) অব্যবহৃত রেখে যেতে পারেন , যেমন আপনি abstractঅন্য abstractশ্রেণি বাড়ানোর ক্লাসগুলির ক্ষেত্রে করেন ।

যখন আপনি implementএকটি interface, নিয়মটি interfaceউত্পন্ন হওয়া সমস্ত পদ্ধতি প্রয়োগ করা আবশ্যক classশুধুমাত্র কংক্রিট classবাস্তবায়নের জন্য প্রযোজ্য (যার অর্থ এটি abstractনিজে নয়)।

যদি আপনি সত্যিই abstract classএটিকে তৈরি করার পরিকল্পনা করেন , তবে এমন কোনও নিয়ম নেই যা বলে যে আপনি implementসমস্ত interfaceপদ্ধতি অবলম্বন করেছেন (নোট করুন যে এ জাতীয় ক্ষেত্রে এটি উদ্ভূত classহিসাবে ঘোষণা করা বাধ্যতামূলক abstract)


javap IAnything.classদ্বিতীয় কোড স্নিপেট তৈরি করতে ব্যবহার করে।
শারহ্প

3

যখন একটি বিমূর্ত শ্রেণি একটি ইন্টারফেস প্রয়োগ করে

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

abstract class X implements Y {   
    // implements all but one method of Y
}

class XX extends X {   
    // implements the remaining method in Y 
} 

এক্ষেত্রে দশম শ্রেণিকে অবশ্যই বিমূর্ত হতে হবে কারণ এটি ওয়াইকে পুরোপুরি বাস্তবায়িত করে না, তবে ক্লাস এক্সএক্স বাস্তবে ওয়াই বাস্তবায়ন করে does

তথ্যসূত্র: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html


1

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

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