ইন্টারফেস বা একটি বিমূর্ত শ্রেণি: কোনটি ব্যবহার করবেন?


327

দয়া করে ব্যাখ্যা করুন কখন আমার পিএইচপি ব্যবহার করা উচিত interfaceএবং কখন আমার একটি ব্যবহার করা উচিত abstract class?

আমি কিভাবে আমার পরিবর্তন করতে পারেন abstract classএকটি করার জন্য interface?

উত্তর:


458

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

যখন আপনি আপনার সিস্টেমে কর্মরত বিকাশকারীদের (নিজেকে অন্তর্ভুক্ত করেছেন) একটি নির্দিষ্ট সংখ্যক পদ্ধতি প্রয়োগ করতে বাধ্য করতে চান এবং আপনি কিছু বেস পদ্ধতি সরবরাহ করতে চান যা তাদের শিশু শ্রেণির বিকাশে সহায়তা করবে।

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

আপনি যে পথে যেতে চান তা অনিশ্চিত হলে ( নীচের ক্লিটাস দ্বারা উল্লিখিত ) একটি ইন্টারফেস তৈরি করা এবং তারপরে আপনার বিমূর্ত শ্রেণিটি সেই ইন্টারফেসটি বাস্তবায়িত করতে পারে এমন এক পদ্ধতির প্রচলিত পদ্ধতি common


12
আমি সারাদিন চেষ্টা করেছিলাম ক্লাসের ব্যবহার abstractএবং ব্যবহারগুলি বোঝার জন্য interface, আপনার পোস্টটি এটি সমস্ত পরিষ্কার করে দিয়েছে। অ্যালানকে অনেক ধন্যবাদ
আফরাজিত

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

সুতরাং অনেক ক্ষেত্রে নমনীয়তার কারণে আমাদের বিমূর্ত শ্রেণি ব্যবহার করা উচিত - এটি আমার উপসংহার :)
ইয়ামাকাক্স

3
@ ভোলোকুগা: অ্যালান যেভাবে বলেছিল, অগত্যা, কেবল একটি বিমূর্তি বাড়ানো যেতে পারে। আমি ব্যক্তিগতভাবে অ্যাবস্ট্রাক্ট কোনও ইন্টারফেস আইডিয়া প্রয়োগ করি তা পছন্দ করি না কারণ এটি কোড অবলম্বনে অবদান রাখে এবং আইএমও কম সরাসরি হয়।
প্রিফিক্স

171

একটি Abstract Classএবং একটি মধ্যে পার্থক্য Interface:

বিমূর্ত ক্লাস

একটি বিমূর্ত শ্রেণি কিছু কার্যকারিতা সরবরাহ করতে পারে এবং বাকী অংশটি উত্পন্ন শ্রেণীর জন্য রেখে দেয়

  • উদ্ভূত শ্রেণি বেস শ্রেণিতে সংজ্ঞায়িত কংক্রিটের কার্যগুলি ওভাররাইড করতে পারে বা নাও পারে

  • একটি বিমূর্ত শ্রেণি থেকে প্রসারিত একটি শিশু শ্রেণীর যুক্তিযুক্তভাবে সম্পর্কিত হওয়া উচিত।

ইন্টারফেস

একটি ইন্টারফেসে কোনও কার্যকারিতা থাকতে পারে না । এটা তোলে শুধুমাত্র পদ্ধতির সংজ্ঞা রয়েছে।

  • উদ্ভূত বর্গ MUST ইন্টারফেসে সংজ্ঞায়িত সমস্ত পদ্ধতির কোড সরবরাহ করে

  • সম্পূর্ণ ভিন্ন এবং সম্পর্কিত সম্পর্কিত ক্লাসগুলি একটি ইন্টারফেস ব্যবহার করে যৌক্তিকভাবে একত্রিত করা যেতে পারে।


1
এটি প্রদর্শনের জন্য আপনি কি বাস্তব জীবনের উদাহরণ সরবরাহ করতে পারেন?
আরএন কুশওয়াহা

1
কী এর মধ্যে পার্থক্য abstract class X implements Yএবং class X implements Y?
ওয়েবিনান

3
@ ওয়েবিনান abstract class X implements Yআপনি ঘোষণা করেছেন যে এক্স এর বাল্ক কার্যকারিতা একটি উদ্ভূত শ্রেণিতে প্রয়োগ করা উচিত এবং বিমূর্ত এবং উদ্ভূত শ্রেণীর উভয়কেই ওয়াই সংজ্ঞায়িত ফাংশন থাকতে হবে , তবে class X implements Yকেবলমাত্র ইঙ্গিত করে যে দশম শ্রেণিতে অবশ্যই ওয়াই সংজ্ঞায়িত ফাংশন থাকতে হবে। যদি আপনার ইন্টারফেস Y একাদশ আসলে কোনও ইন্টারফেস হিসাবে ওয়াই সংজ্ঞায়িত করা বাদ দেয় এবং ডাইরিং শ্রেণিতে প্রয়োগ করা হয় তা নিশ্চিত করার জন্য কেবল ওয়াইয়ের ফাংশনগুলি পাবলিক / সুরক্ষিত / প্রাইভেট অ্যাবস্ট্রাক্ট ফাংশন হিসাবে বাস্তবায়িত করা ব্যতীত অন্য কোনও শ্রেণীর দ্বারা বাস্তবায়নের উদ্দেশ্যে নয়।
বার্গস্ট্রমে

1
ইন্টারফেসগুলি কেবল পদ্ধতির
সংজ্ঞাই

আপনার তুলনা পছন্দ করেছেন তাই কিছু যুক্ত করতে চেয়েছিলেন। ইন্টারফেস বাক্সের বাইরে ক্লাস ধ্রুবক থাকতে পারে যখন বিমূর্ত ক্লাসটি পারে না।
নোমান ইব্রাহিম 10

128

বিমূর্ত ক্লাস ব্যবহার করবেন কেন? নীচে একটি সহজ উদাহরণ। আসুন আমাদের নীচের কোড রয়েছে বলে দিন:

<?php 

class Fruit {
    private $color;

    public function eat() {
        // chew
    }

    public function setColor($c) {
        $this->color = $c;
    }
}

class Apple extends Fruit {
    public function eat() {
        // chew until core
    }
}

class Orange extends Fruit {
    public function eat() {
        // peeling
        // chew
    }
}

এখন আমি আপনাকে একটি আপেল দেব এবং আপনি এটি খাবেন। এটার স্বাদ কেমন? এর স্বাদ আপেলের মতো।

<?php 
$apple = new Apple();
$apple->eat();

// Now I give you a fruit.
$fruit = new Fruit();
$fruit->eat();

এই স্বাদ কি পছন্দ করে? ঠিক আছে, এটি খুব একটা বোঝায় না, তাই আপনার এটি করা সম্ভব হবে না। এটি ফল শ্রেণীর বিমূর্তকরণ এবং সেইসাথে এর ভিতরে খাওয়ার পদ্ধতি তৈরি করে এটি সম্পন্ন হয়।

<?php 
abstract class Fruit {
    private $color;

    abstract public function eat(){}

    public function setColor($c) {
        $this->color = $c;
    }
}
?>

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

একটি বাস্তব বিশ্বের উদাহরণ:

<?php 
abstract class person {

    public $LastName;
    public $FirstName;
    public $BirthDate;

    abstract protected function write_info();
}

final class employee extends person{

    public $EmployeeNumber;
    public $DateHired;

    public function write_info(){
        //sql codes here
        echo "Writing ". $this->LastName . "'s info to emloyee dbase table <br>";   
    }
}

final class student extends person{

    public $StudentNumber;
    public $CourseName;

    public function write_info(){
        //sql codes here
        echo "Writing ". $this->LastName . "'s info to student dbase table <br>";
    }
}

///----------
$personA = new employee;
$personB = new student;

$personA->FirstName="Joe";
$personA->LastName="Sbody";

$personB->FirstName="Ben";
$personB->LastName="Dover";

$personA->write_info();
// Writing Sbody's info to emloyee dbase table
$personB->write_info();
// Writing Dover's info to student dbase table 

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

9
আমি আপনাকে ফলের উদাহরণ মানুষ হিসাবে ভালবাসি! যেহেতু আমি পিএইচপি শিখতে শুরু করেছি, এই এক্সপ্লেসগুলি আমাকে পরিষ্কার ধন্যবাদ দিয়েছে
রাহেল

23
+1 What does that taste like? Well, it doesn't make much sense, so you shouldn't be able to do that.এখন আমি বিমূর্ত জানি!
ওয়েবিনান

finalকীওয়ার্ডটি কী করে ? দুর্দান্ত পোস্ট, ধন্যবাদ।
গস

1
@ ভিনিশকালিকারিক আমি ব্যক্তির উদাহরণে যা বুঝতে পারি না তার মধ্যে পার্থক্য হ'ল: 1) বিমূর্ত শ্রেণি ব্যক্তি ব্যবহার করে (উদাহরণ হিসাবে); ২) ব্যক্তিকে একটি স্ট্যান্ডার্ড ক্লাস হিসাবে লিখতে এবং কর্মী এবং ছাত্রকে লেখার_আইনফো () পদ্ধতিতে ওভাররাইড করে।
21

66

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


37

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

এই ক্ষেত্রে:

<?php
class parser implements parserDecoratorPattern {
    //...
}

এইভাবে, যে কেউ আমার কোড পড়ছেন (এবং কে জানেন যে ডেকোরেটর প্যাটার্নটি কী তা তা অবিলম্বেই জানতে হবে ক) আমি কীভাবে আমার পার্সার তৈরি করি এবং খ) সজ্জিত প্যাটার্নটি প্রয়োগ করতে কী কী পদ্ধতি ব্যবহার করা হয় তা দেখতে সক্ষম হতে হবে।

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

এটি দেরী হয়ে গেছে এবং আমি আরও ভাল সিউডো-কোড উদাহরণটি ভাবতে পারি না, তবে এখানে যায়:

<?php
interface TelevisionControls {};
class Remote implements TelevisionControls {};
class Spouse implements TelevisionControls {};
Spouse spouse = new Spouse();
Remote remote = new Remote();
isSameType = (bool)(remote == spouse)

1
কী ভয়াবহ উদাহরণ! ;)
জোয়েল মারফি

@ ম্যাট 2000 যৌনতাবাদী নয় এবং এখন সমকামী বিবাহের জন্যও কাজ করে। দুর্দান্ত সম্পাদনা। :)
অস্টেন হুজেন

4
এটি একটি দুর্দান্ত উদাহরণ! যাইহোক, আমি মনে করি না আপনি কোনও বিমূর্ত ক্লাসটি ইনস্ট্যান্ট করতে পারবেন বরং এমন একটি ক্লাস যা একটি বিমূর্ত শ্রেণি থেকে প্রসারিত
Arielle Nguyen

2
কমপক্ষে প্রশ্নযুক্ত ভাষার মতো সুডো কোড তৈরি করতে হত্যা করবে না। কারও উচিত সেখানে কিছু রাখা উচিত।
আমি একবার ভাল্লুক কুস্তি করেছিলাম।

2
উদাহরণটি মজার হলেও আমরা সরাসরি কোনও বিমূর্ত ক্লাসটি ইনস্ট্যান্ট করতে পারি না, দয়া করে উদাহরণে পরিবর্তন করুন যাতে লোকেরা এটি পিএইচপি-তে বৈধ ব্যবহার হিসাবে বিবেচনা না করে।
saji89

16

মূল পার্থক্য হ'ল বিমূর্ত শ্রেণিতে ডিফল্ট প্রয়োগ থাকতে পারে যেখানে কোনও ইন্টারফেস পারে না।

একটি ইন্টারফেস কোনও বাস্তবায়ন ছাড়াই আচরণের চুক্তি contract


16

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

যদি আপনার ইংরেজি নেটিভ না হয় তবে আপনি অ্যাবস্ট্রাকশন এবং ইন্টারফেসগুলি আসলে কী তা দেখতে পাচ্ছেন। এবং প্রতিশব্দটিও সন্ধান করুন।

এবং এটি আপনাকে রূপক হিসাবে সাহায্য করতে পারে:

ইন্টারফেস

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

কথাটি এখানে

- এটি সঠিক করার জন্য
- সাবধানতা অবলম্বন করা
- যা খারাপ হতে পারে এমন জিনিসগুলি রোধ করা (খুব বেশি স্ট্রবেরি বা কোনও কিছুর মতো)
- যে ব্যক্তিরা চেষ্টা করে তাদের পক্ষে সহজেই রাখা - কী করতে হবে তা
আপনাকে বলতে (স্ট্রিংয়ের মতো) )
- আপনি কোন কাজগুলি করতে পারেন তা বলতে কিন্তু এটি করতে হবে না

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


বিমূর্তন

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

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

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

আপনি সেখানে যান, আপনি কেক প্রসারিত করেছেন, ইন্টারফেসটি অনুসরণ করেছেন এবং এখান থেকে বিমূর্ত পদক্ষেপ এবং উপাদানগুলি রেখেছেন।


1
এটি পিএইচপি সম্পর্কিত যে কোনও বিষয় থেকে আমার প্রিয় তুলনা হয়েছে। এটা সত্যিই বোধগম্য। ধন্যবাদ!
cbloss793

13

ইতিমধ্যে কয়েকটি দুর্দান্ত উত্তর যুক্ত করতে:

  • বিমূর্ত শ্রেণিগুলি আপনাকে প্রয়োগের কিছু ডিগ্রী সরবরাহ করতে দেয়, ইন্টারফেসগুলি খাঁটি টেম্পলেটগুলি। একটি ইন্টারফেস কেবল কার্যকারিতা সংজ্ঞায়িত করতে পারে , এটি কখনই এটি প্রয়োগ করতে পারে না।

  • ইন্টারফেস প্রয়োগ করে এমন কোনও শ্রেণি তার সংজ্ঞায়িত সমস্ত পদ্ধতি বাস্তবায়নের প্রতিশ্রুতি দেয় বা এটি বিমূর্ত হিসাবে ঘোষণা করতে হবে।

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

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

  • একটি শ্রেণি উভয়ই একটি সুপার ক্লাস প্রসারিত করতে পারে এবং যে কোনও সংখ্যক ইন্টারফেস প্রয়োগ করতে পারে:

    class SubClass extends ParentClass implements Interface1, Interface2 {
        // ...
    }

দয়া করে ব্যাখ্যা করুন কখন আমার একটি ইন্টারফেস ব্যবহার করা উচিত এবং কখন আমার বিমূর্ত ক্লাস ব্যবহার করা উচিত?

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

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

<?php
// interface
class X implements Y { } // this is saying that "X" agrees to speak language "Y" with your code.

// abstract class
class X extends Y { } // this is saying that "X" is going to complete the partial class "Y".
?>

আমি কীভাবে আমার বিমূর্ত শ্রেণিকে একটি ইন্টারফেসে পরিবর্তন করতে পারি?

এখানে একটি সরলীকৃত কেস / উদাহরণ দেওয়া আছে। বাস্তবায়নের কোনও বিবরণ বাইরে নিয়ে আসুন। উদাহরণস্বরূপ, আপনার বিমূর্ত শ্রেণি এর থেকে পরিবর্তন করুন:

abstract class ClassToBuildUpon {
    public function doSomething() {
          echo 'Did something.';
    }
}

প্রতি:

interface ClassToBuildUpon {
    public function doSomething();
}

12

একটি ফিলোসোফিক দৃষ্টিকোণ থেকে:

  • একটি বিমূর্ত শ্রেণি একটি "একটি" সম্পর্ককে উপস্থাপন করে। আসুন বলুন যে আমার ফল রয়েছে, ভাল আমার একটি ফলের বিমূর্ত শ্রেণি থাকবে যা সাধারণ দায়বদ্ধতা এবং সাধারণ আচরণ ভাগ করে দেয়।

  • একটি ইন্টারফেস একটি "করণীয়" সম্পর্কের প্রতিনিধিত্ব করে। আমার মতে একটি ইন্টারফেস, (যা জুনিয়র দেবের মতামত), কোনও ক্রিয়াকলাপের দ্বারা বা কোনও ক্রিয়াকলাপের কাছাকাছি কিছু দ্বারা নামকরণ করা উচিত, (দুঃখিত, শব্দটি খুঁজে পাচ্ছেন না, আমি ইংরেজী নেটিভ স্পিকার নই) আইয়্যাটেবল বলতে দিন। আপনি জানেন যে এটি খাওয়া যেতে পারে, তবে আপনি কী খাবেন তা জানেন না।

কোডিং দৃষ্টিকোণ থেকে:

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

  • আর একটি পার্থক্য হ'ল কোনও বস্তু আপনার প্রয়োজন অনুযায়ী অনেকগুলি ইন্টারফেস প্রয়োগ করতে পারে তবে "হীরা সমস্যা" এর কারণে আপনার কেবল একটি বিমূর্ত শ্রেণি থাকতে পারে (কেন এটি জানতে এখানে পরীক্ষা করে দেখুন! Http://en.wikedia.org/wiki/ একাধিক_হিরনত্ব # দ্য_ডায়ামন্ড_প্রব্লেম )

আমি সম্ভবত কিছু বিষয় ভুলে গেছি তবে আমি আশা করি এটি বিষয়গুলি পরিষ্কার করতে পারে।

পিএস: "একটি" / "করণীয়" নিয়ে এসেছেন বিবেক ভার্মানীর উত্তর, আমি তার উত্তর চুরি করতে চাইছিলাম না, কেবল শর্তাদি পুনরায় ব্যবহার করার জন্য কারণ আমি তাদের পছন্দ করেছি!


2
আপনি যে শব্দটির সন্ধান করছেন তা ভোজ্য, আমি বিশ্বাস করি।
ট্র্যাভিস ওয়েস্টন

1
আসলে, আমি বিশ্বাস করি এটি একটি "ক্রিয়াপদ", একটি "করণীয় শব্দ"
গ্রিজলি

7

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

একটি শ্রেণীর একটি সত্তাকে প্রতিনিধিত্ব করা উচিত যেখানে ইন্টারফেসের আচরণের প্রতিনিধিত্ব করা উচিত।

একটি উদাহরণ নেওয়া যাক। একটি কম্পিউটার মনিটর একটি সত্তা এবং এটি একটি শ্রেণি হিসাবে প্রতিনিধিত্ব করা উচিত।

class Monitor{
    private int monitorNo;
}

এটি আপনাকে একটি ডিসপ্লে ইন্টারফেস সরবরাহ করার জন্য ডিজাইন করা হয়েছে, সুতরাং কার্যকারিতাটি একটি ইন্টারফেস দ্বারা সংজ্ঞায়িত করা উচিত।

interface Display{
    void display();
}

অন্যান্য উত্তরে বর্ণিত হিসাবে বিবেচনা করার মতো আরও অনেক বিষয় রয়েছে তবে কোডিংয়ের সময় এটি বেশিরভাগ মৌলিক বিষয় যা উপেক্ষা করে।



1

আপনার যখন উভয় ব্যবহারের প্রয়োজন হতে পারে তখন কেবল একটি উদাহরণ যুক্ত করতে চেয়েছিলেন। আমি বর্তমানে একটি সাধারণ উদ্দেশ্যে ERP সমাধানে একটি ডাটাবেস মডেলের সাথে আবদ্ধ একটি ফাইল হ্যান্ডলার লিখছি।

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

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

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

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