পিএইচপি এর ইন্টারফেসের বিন্দুটি কী?


224

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

বিমূর্ত শ্রেণি পদ্ধতিতে কোড যুক্ত করার পাশাপাশি আপনাকে একই জিনিস করতে দেয়।

এখন আপনি যদি বিমূর্ত ক্লাসগুলির সাথে একই লক্ষ্য অর্জন করতে পারেন তবে কেন আমাদের এমনকি ইন্টারফেসের ধারণাটিও প্রয়োজন?

আমাকে বলা হয়েছে যে এটি সিও ++ থেকে জাভা পর্যন্ত ওও তত্ত্বের সাথে সম্পর্কযুক্ত যা পিএইচপি-র ওও স্টাফের উপর ভিত্তি করে। জাভাতে ধারণাটি কি পিএইচপিতে কার্যকর নয়? অ্যাবস্ট্রাক্ট ক্লাসে স্থানধারীদের জঞ্জাল দেওয়া থেকে বিরত রাখা কি কেবল এই উপায়? আমি কিছু অনুপস্থিত করছি?


4
আপনাকে এটি পড়তে হবে: stackoverflow.com/a/384067/14673
লুচ এম

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

উত্তর:


142

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

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


39
এটিও বলা যেতে পারে যে * ইন্টারফেসগুলি শূন্য বাস্তবায়নের সাথে একটি শ্রেণির জন্য নকশা সরবরাহ করে। * বিমূর্ত শ্রেণিগুলি কিছু বাস্তবায়ন সহ কিছু নকশা সরবরাহ করে। অ্যাবস্ট্রাক্ট ক্লাসগুলি সর্বাধিক কার্যকর যেখানে শিশু ক্লাসগুলি কিছু বাস্তবায়নের মিল ভাগ করে দেয় তবে কিছু বাস্তবায়নে পৃথক হয়।
Jrgns

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

15
ইন্টারফেসগুলি মোটেই তা নয়। এটি একাধিক উত্তরাধিকার সম্পর্কে কোনও আপস নয়, এটি বস্তুগুলি বাস্তবায়নের জন্য এবং অন্যান্য অবজেক্ট / পদ্ধতি ব্যবহারের জন্য একটি ধারণামূলক এবং বিমূর্ত চুক্তি তৈরির বিষয়ে। ইন্টারফেসগুলি পলিমারফিজমের জন্য একটি সরঞ্জাম, এবং সরাসরি উত্তরাধিকারের জন্য নয়।
মাদারার ঘোস্ট

123

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


এটি আমাকে কিছুটা বুঝতে পেরেছিল। এটি নেমস্পেসের মতো - সুতরাং ভাগ করা কোডটি ব্যবহার করা সহজ এবং কোনও বিরোধ নেই। দু'জন লোক একই বেসে ক্লাস করা ঠিক তখনই সহজ?
রেডক্লোভার

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

70

যদি ইতিমধ্যে বিমূর্ত ক্লাস থাকে তবে আপনার কেন একটি ইন্টারফেসের প্রয়োজন হবে? একাধিক উত্তরাধিকার রোধ করতে (একাধিক জ্ঞাত সমস্যা দেখা দিতে পারে)।

এরকম একটি সমস্যা:

"হীরা সমস্যা" (কখনও কখনও "মৃত্যুর মারাত্মক হীরা" হিসাবে পরিচিত) হ'ল একটি দ্ব্যর্থতা যা তখন উত্থিত হয় যখন দুটি শ্রেণি বি এবং সি এ থেকে উত্তীর্ণ হয় এবং বর্গ ডি এবং বি থেকে উভয়ই উত্তরাধিকার সূত্রে প্রাপ্ত হয় যদি এ-তে কোনও পদ্ধতি থাকে তবে বি এবং সি ওভাররাইড করেছে এবং ডি এটিকে ওভাররাইড করে না, তারপরে ডি পদ্ধতির কোন সংস্করণটি উত্তরাধিকার সূত্রে পাওয়া যায়: বি এর, না সি?

সূত্র: https://en.wikedia.org/wiki/ মাল্টিপল_হিরিট্যান্স# দ্য_ডাইমন্ড_প্রব্লেম

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

একটি ইন্টারফেস আপনার জন্য কী করে (কেন কেউ কেউ এটি ব্যবহার করবে)? একটি ইন্টারফেস আপনাকে "ভুল" করতে বাধা দেয় (এটি আপনাকে আশ্বাস দেয় যে একটি নির্দিষ্ট ইন্টারফেস প্রয়োগকারী সমস্ত শ্রেণীর ইন্টারফেসে থাকা সমস্ত পদ্ধতি থাকবে)।

// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{   
    public function Create($personObject);
}

class MySqlPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Create a new person in MySql database.
    }
}

class MongoPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
    }
}

এই Create()পদ্ধতিটি সর্বদা একইভাবে ব্যবহৃত হবে। আমরা MySqlPersonক্লাস বা ক্লাস ব্যবহার করছি তা MongoPersonবিবেচ্য নয়। আমরা কীভাবে কোনও পদ্ধতি ব্যবহার করছি তা একই থাকে (ইন্টারফেসটি একই থাকে)।

উদাহরণস্বরূপ, এটি এর মতো ব্যবহার করা হবে (আমাদের কোডের যে কোনও জায়গায়):

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);

এইভাবে, এরকম কিছু ঘটতে পারে না:

new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);

একটি ইন্টারফেস মনে রাখা এবং একাধিক বিভিন্নগুলির চেয়ে সর্বত্র একই ব্যবহার করা অনেক সহজ।

এই পদ্ধতিতে, Create()"বাইরের" কোডকে প্রভাবিত না করে পদ্ধতির অভ্যন্তর বিভিন্ন শ্রেণীর জন্য আলাদা হতে পারে, যা এই পদ্ধতিটিকে কল করে। বাইরের সমস্ত কোডটি জানতে হবে যে পদ্ধতিটির Create()1 টি প্যারামিটার ( $personObject) রয়েছে, কারণ বাইরের কোডটি এই পদ্ধতিটি ব্যবহার / কল করবে। বাইরের কোডটি পদ্ধতির ভিতরে কী ঘটছে সেদিকে খেয়াল রাখে না; এটি কেবল কীভাবে ব্যবহার করতে / কল করতে হবে তা জানতে হবে।

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

একটি শ্রেণি যা ইন্টারফেস প্রয়োগ করে তার অবশ্যই সমস্ত পদ্ধতি প্রয়োগ করতে হবে, যা ইন্টারফেসটি / করে।

আমি আশা করি আমি নিজেকে খুব বেশি পুনরাবৃত্তি করিনি।


গাড়ির পেডালগুলির সাথে সত্যিই দুর্দান্ত উপমা!
জেমস

24

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

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

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

বিপরীতে, আমি এমন একটি বস্তুও তৈরি করতে পারি যা অ্যাকাউন্ট থেকে প্রসারিত হয় না, কোনও ব্যবহারকারী বিমূর্ত শ্রেণি বলে, এবং এখনও তালিকাভুক্ত এবং সম্পাদনযোগ্য প্রয়োগ করে তবে সংস্করণযোগ্য নয়, যা এখানে বোঝায় না।

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

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


এটি ঠিক এখানেই। আপনার পদ্ধতিগুলি প্রসারিত বা ওভাররাইট না করে ব্যবহার করার জন্য কঠোরভাবে প্রয়োগ করুন
নিক

21

ইন্টারফেসগুলি মূলত আপনি যা তৈরি করতে পারেন তার একটি নীলনকশা। তারা শ্রেণীর কী কী পদ্ধতি থাকতে হবে তা নির্ধারণ করে তবে আপনি এই সীমাবদ্ধতার বাইরে অতিরিক্ত পদ্ধতি তৈরি করতে পারেন।

পদ্ধতিগুলিতে কোড যুক্ত করতে না পেরে আপনি কী বোঝাতে চেয়েছেন তা আমি নিশ্চিত নই - কারণ আপনি পারেন। আপনি কি কোনও বিমূর্ত শ্রেণিতে বা এটি প্রসারিত শ্রেণীর সাথে ইন্টারফেস প্রয়োগ করছেন?

বিমূর্ত শ্রেণিতে প্রয়োগ করা ইন্টারফেসের একটি পদ্ধতিটি সেই বিমূর্ত শ্রেণিতে প্রয়োগ করা দরকার। তবে সেই ইন্টারফেসটি প্রসারিত শ্রেণিতে প্রয়োগ করুন এবং পদ্ধতিটি কেবল প্রসারিত শ্রেণিতে প্রয়োগ করতে হবে। আমি এখানে ভুল হতে পারি - আমি যতটা সম্ভব / করা উচিত ইন্টারফেস ব্যবহার করি না।

আমি সবসময় ইন্টারফেসগুলি বহিরাগত বিকাশকারীদের জন্য নিদর্শন হিসাবে বা জিনিসগুলি সঠিক কিনা তা নিশ্চিত করার জন্য একটি অতিরিক্ত নিয়মানুষ হিসাবে বিবেচনা করেছি।


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

13

আপনি পিএইচপি-তে ইন্টারফেসগুলি ব্যবহার করবেন:

  1. বাস্তবায়ন আড়াল করার জন্য - আপনি যে সমস্ত জায়গাগুলি ব্যবহার করেছেন সেখানে রিফ্যাক্টর না করেই কোনও শ্রেণীর অবজেক্টের অ্যাক্সেস প্রোটোকল স্থাপন করুন objects
  2. প্রকারটি পরীক্ষা করতে - যেমন কোনও প্যারামিটারের একটি নির্দিষ্ট প্রকার রয়েছে তা নিশ্চিত করে $object instanceof MyInterface
  3. রানটাইমে প্যারামিটার চেকিং প্রয়োগ করতে
  4. একক শ্রেণিতে একাধিক আচরণ বাস্তবায়নের জন্য (জটিল ধরণের নির্মাণ)

    ক্লাস কার প্রয়োগ করে ইঞ্জিনইন্টারফেস, বডিআইন্টারফেস, স্টিয়ারিংআইনটারফেস {

যাতে Carএখন কোনও অবজেক্ট সিএ start(), stop()(ইঞ্জিনইন্টারফেস) বা goRight(), goLeft()(স্টিয়ারিং ইন্টারফেস)

এবং অন্যান্য জিনিস আমি এখনই ভাবতে পারি না

4 নম্বর এটি সম্ভবত সবচেয়ে স্পষ্ট ব্যবহারের ক্ষেত্রে যা আপনি বিমূর্ত ক্লাসগুলির সাথে সম্বোধন করতে পারেন না।

জাভায় চিন্তাভাবনা থেকে:

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


10

ইন্টারফেসগুলি ভিত্তি হিসাবে বিদ্যমান নয় যেখানে ক্লাসগুলি প্রসারিত করতে পারে তবে প্রয়োজনীয় ফাংশনগুলির মানচিত্র হিসাবে।

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

<?php

interface ImportableFeed 
{
    public function getEvents();
}

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

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

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

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

<?php
interface ImportableFeed 
{
    /**
     * @return array
     */
    public function getEvents();
}

বিমূর্ত ক্লাস এবং ইন্টারফেসের তুলনা করার মতো খুব বেশি জায়গা নেই। ইন্টারফেসগুলি কেবলমাত্র মানচিত্র যা প্রয়োগ করা হলে শ্রেণীর সর্বজনীন ইন্টারফেসের সেট থাকতে হয়।


ভাল ব্যাখ্যা :) ধন্যবাদ!
রাজওয়ান .3232

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

8

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

interface Readable {
  String read();
}

List<Readable> readables; // dunno what these actually are, but we know they have read();
for(Readable reader : readables)
  System.out.println(reader.read());

বেশিরভাগ ক্ষেত্রে, এটি একটি বেস ক্লাস প্রদান, বিমূর্ত বা না দেওয়া বোঝায় না, কারণ বাস্তবায়নগুলি বন্যভাবে পরিবর্তিত হয় এবং কয়েকটি পদ্ধতির পাশাপাশি সাধারণ কিছু ভাগ করে না।

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


6

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

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

tl; dr: ইন্টারফেসগুলি এমন পদ্ধতির তালিকার সংজ্ঞা দেয় যা অনুসরণ করা দরকার (এপিআই ভাবি), যখন একটি বিমূর্ত শ্রেণি কিছু বেসিক / সাধারণ কার্যকারিতা দেয় যা সাবক্লাসগুলি নির্দিষ্ট প্রয়োজনীয়তার সাথে পরিমার্জন করে।


পিএইচপি 6 কখনই প্রকাশিত হবে না। পিএইচপি 6 হ'ল এমন একটি প্রকল্প যা ২০০৫-২০১০ থেকে উন্নত ছিল তবে এটি বিলম্বিত হয়ে শেষ পর্যন্ত বাতিল হয়ে যায়। পিএইচপি 7 পরবর্তী সংস্করণ, বেশিরভাগ প্রাক্তন পিএইচপি 6 প্রকল্পের সাথে বিভ্রান্তি এড়াতে avoid
আশু ঝা

5

পিএইচপি এই ক্ষেত্রে আলাদা কিনা তা আমি মনে করতে পারি না, তবে জাভাতে আপনি একাধিক ইন্টারফেস প্রয়োগ করতে পারেন, তবে আপনি একাধিক বিমূর্ত ক্লাস উত্তরাধিকারী করতে পারবেন না। আমি ধরে নিই পিএইচপি একইভাবে কাজ করে।

পিএইচপি-তে আপনি কমা দিয়ে আলাদা করে একাধিক ইন্টারফেস প্রয়োগ করতে পারেন (আমার মনে হয়, আমি এটি একটি পরিষ্কার সলিউশন পাই না)।

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


4

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

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

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

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


2

নীচে পিএইচপি ইন্টারফেসের জন্য পয়েন্ট রয়েছে

  1. এটি ক্লাসে প্রয়োজনীয় কোনও পদ্ধতি সংজ্ঞায়িত করতে ব্যবহৃত হয় [আপনি যদি এইচটিএমএল লোড করতে চান তবে আইডি এবং নাম প্রয়োজন তাই এই ক্ষেত্রে ইন্টারফেসে সেটআইডি এবং সেটনাম অন্তর্ভুক্ত করা হবে]।
  2. ইন্টারফেস ক্লাসটিকে কঠোরভাবে সমস্ত পদ্ধতিতে এটি সংজ্ঞায়িত করতে বাধ্য করে।
  3. আপনি কেবল জনসাধারণের অ্যাক্সেসযোগ্যতার সাথে ইন্টারফেসে পদ্ধতিটি নির্ধারণ করতে পারেন।
  4. আপনি ক্লাসের মতো ইন্টারফেসও প্রসারিত করতে পারেন। এক্সটেনড কীওয়ার্ড ব্যবহার করে আপনি পিএইচপিতে ইন্টারফেস প্রসারিত করতে পারেন।
  5. একাধিক ইন্টারফেস প্রসারিত করুন।
  6. উভয় একই নামের সাথে ফাংশন ভাগ করে নিলে আপনি দুটি ইন্টারফেস বাস্তবায়ন করতে পারবেন না। এটি ত্রুটি নিক্ষেপ করবে।

উদাহরণ কোড:

interface test{
    public function A($i);
    public function B($j = 20);
}

class xyz implements test{
    public function A($a){
        echo "CLASS A Value is ".$a;
    }
    public function B($b){
        echo "CLASS B Value is ".$b;
    }
}
$x = new xyz();
echo $x->A(11);
echo "<br/>";
echo $x->B(10);

2

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

1. আন্তঃফেসগুলি বিমূর্ত পদ্ধতি এবং ধ্রুবকগুলি অন্তর্ভুক্ত করতে পারে তবে কংক্রিটের পদ্ধতি এবং ভেরিয়েবলগুলি ধারণ করতে পারে না।

2. ইন্টারফেসের সমস্ত পদ্ধতি অবশ্যই জনসাধারণের দৃশ্যমানতার সুযোগের মধ্যে থাকতে হবে ।

৩.এ শ্রেণি একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে, যখন এটি কেবলমাত্র একটি বিমূর্ত শ্রেণীর উত্তরাধিকারী হতে পারে।

                                  interface                      abstract class
the code                     - abstract methods               - abstract methods
                             - constants                      - constants                  
                                                              - concrete methods
                                                              - concrete variables

access modifiers             
                             - public                         - public
                                                              - protected
                                                              - private
                                                                etc.
number of parents          The same class can implement
                           more than 1 interface              The child class can 
                                                              inherit only from 1 abstract class

আশা করি এটি যে কাউকে বুঝতে সহায়তা করবে!


2

ইন্টারফেসগুলি আপনার জিনের মতো।

বিমূর্ত ক্লাসগুলি আপনার প্রকৃত পিতামাতার মতো।

তাদের উদ্দেশ্য বংশগত, কিন্তু বিমূর্ত শ্রেণি বনাম ইন্টারফেসের ক্ষেত্রে, উত্তরাধিকার সূত্রে প্রাপ্ত যা আরও সুনির্দিষ্ট।


2

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

একটি ইন্টারফেস একটি "চুক্তি" হিসাবে কাজ করে, নির্দিষ্ট করে সাবক্লাসগুলির সেট কী করে তা কীভাবে তা করে না।

নিয়ম

  1. একটি ইন্টারফেস তাত্ক্ষণিক হতে পারে না।

  2. আপনি কোনও ইন্টারফেসে কোনও পদ্ধতি প্রয়োগ করতে পারবেন না, যেমন এটিতে কেবল পদ্ধতিটির স্বাক্ষর রয়েছে তবে বিবরণ (বডি) নেই।

  3. ইন্টারফেসে পদ্ধতি এবং / অথবা ধ্রুবক থাকতে পারে তবে কোনও বৈশিষ্ট্য নেই। ইন্টারফেস ধ্রুবকগুলির ক্লাস কনস্ট্যান্টের মতোই বিধিনিষেধ রয়েছে। ইন্টারফেস পদ্ধতিগুলি সুস্পষ্টভাবে বিমূর্ত।

  4. ইন্টারফেসগুলি অবশ্যই নির্মাতা বা ধ্বংসকারীদের ঘোষণা করতে পারে না, কারণ এগুলি শ্রেণি স্তরের বাস্তবায়নের বিশদ।

  5. একটি ইন্টারফেসের সমস্ত পদ্ধতির অবশ্যই জনসমক্ষে দৃশ্যমানতা থাকতে হবে।

এখন একটি উদাহরণ নেওয়া যাক। ধরুন আমাদের দুটি খেলনা রয়েছে: একটি কুকুর, এবং অন্যটি একটি বিড়াল।

যেমনটি আমরা একটি কুকুরের ছাঁটাই জানি, এবং বিড়াল মিউজ। এই দু'জনের একই কথা বলার পদ্ধতি রয়েছে তবে বিভিন্ন কার্যকারিতা বা বাস্তবায়ন রয়েছে। মনে করুন আমরা ব্যবহারকারীকে এমন একটি রিমোট কন্ট্রোল দিচ্ছি যার স্পিচ বোতাম রয়েছে।

যখন ব্যবহারকারী স্পিক বোতাম টিপেন, খেলনাটি কথা বলতে হয় তা কুকুর বা বিড়াল কিনা তা বিবেচ্য নয়।

এটি একটি ইন্টারফেস ব্যবহার করা ভাল ক্ষেত্রে, একটি বিমূর্ত শ্রেণি নয় কারণ বাস্তবায়নগুলি পৃথক। কেন? মনে রাখা

আপনার যদি কিছু অ-বিমূর্ত পদ্ধতি যুক্ত করে শিশু ক্লাসগুলিকে সমর্থন করার প্রয়োজন হয় তবে আপনার বিমূর্ত ক্লাস ব্যবহার করা উচিত। অন্যথায়, ইন্টারফেস আপনার পছন্দ হবে।

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