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


15

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

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

এখানে আমি তৈরি করেছি দুটি ক্লাস:

class Ad {
    $title;
    $description
    $price;

    function get_data($website){  }

    function validate_price(){  }
 }


class calendar_event {
    $title;
    $description

    $start_date;

    function get_data($website){ //guts }

    function validate_dates(){ //guts }
 }

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

এখন আমি DRY নীতি লঙ্ঘন করেছি এবং আমি একাধিক ফাইল জুড়ে একই কোড পরিচালনা ও পরিবর্তন করছি। আমি নৌকা, ঘোড়া, বা যাই হোক না কেন আরও ক্লাস করার ইচ্ছা করি।

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

abstract class content {
    $title;
    $description


    function get_data($website){  }

    function common_function2() { }
    function common_function3() { }
 }


class calendar_event extends content {

    $start_date;

    function validate_dates(){  }
 }

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

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

ধন্যবাদ!


অনলাইনে অনেক ভাল উদাহরণ রয়েছে। আমি মনে করি এটি তাদের মধ্যে একটি। javapapers.com/core-java/abstract-and-interface-core-java-2/…
শিভা

উত্তর:


26

সাধারণ লোকের পদে:

ইন্টারফেস জন্য "কি করতে পারেন / হিসাবে গণ্য করা যেতে পারে" সম্পর্কের প্রকার।

সারাংশ (সেইসাথে কংক্রিট) শ্রেণীর জন্য "একটি হল" সম্পর্ক ধরনের।

এই উদাহরণগুলি দেখুন:

class Bird extends Animal implements Flight;
class Plane extends Vehicle implements Flight, AccountableAsset;
class Mosquito extends Animal implements Flight;
class Horse extends Animal;
class RaceHorse extends Horse implements AccountableAsset;
class Pegasus extends Horse implements Flight;

Bird, Mosquitoএবং Horse হয় Animals । তারা সম্পর্কিত হয়। তারা প্রাণীর মতো সাধারণ পদ্ধতির উত্তরাধিকারী eat(), metabolize() and reproduce()। হতে পারে তারা এই পদ্ধতিগুলিকে ওভাররাইড করে তাদের সাথে কিছুটা অতিরিক্ত যোগ করে তবে তারা এ্যানিমাল লাইকের ক্ষেত্রে প্রয়োগ করা ডিফল্ট আচরণের সুযোগ নেয়metabolizeGlucose().

Planeসম্পর্কিত নয় Bird, Mosquitoবা Horse

Flightঅসম্পূর্ণ, সম্পর্কিত সম্পর্কহীন ক্লাস, Birdএবং মত দিয়ে প্রয়োগ করা হয় Plane

AccountableAssetঅসম্পূর্ণ, সম্পর্কিত সম্পর্কহীন ক্লাসগুলি Planeএবং পছন্দ মতো দ্বারা প্রয়োগ করা হয় RaceHorse

Horse ফ্লাইট বাস্তবায়ন করে না

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

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

উদাহরণস্বরূপ, আপনি কোনও প্রোগ্রামের দল বা AccountableAssetsতার নির্বিশেষে কোনও গ্রুপের মান যোগ করতে পারেন ।RaceHorsesPlanes


অ্যামেজিং। ইন্টারফেস কার্যকারিতার একটি নির্দিষ্ট বিভাগ সরবরাহ করে যা আরোপ করে can do/can be treated asযেখানে বিমূর্ত শ্রেণিগুলি ভিত্তি হিসাবে কাজ করে!
অভিহিরোজ পানওয়ার

13

আপনি উভয়ের মধ্যে পার্থক্য সম্পর্কে সচেতন বলে মনে হচ্ছে আপনি যুক্তিযুক্তভাবে উত্তরটি কাটাতে পারেন।

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

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

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

এছাড়াও, গুগলে ফলাফলের কোনও অভাব নেই বলে মনে হয়।


3

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

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

আশা করি এটি সহায়তা করে তবে এই অনলাইন লিওতে প্রচুর তথ্য রয়েছে


2
Classes cannot have multiple inheritance- জাভা এবং সি # এর মতো ভাষার ক্ষেত্রে সত্য, সি ++ এর ক্ষেত্রে সত্য নয়।
রবার্ট হার্ভে

3

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

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

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

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


3

পার্থক্যটি সূক্ষ্ম তবে একটি পরিষ্কার। ইন্টারফেস পলিমারফিক আচরণ সম্পর্কে। অ্যাবস্ট্রাক্ট ক্লাস পুনরায় ব্যবহার এবং পলিমারফিক আচরণ সম্পর্কে।

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

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


-3
  1. প্রধান পার্থক্য হ'ল একটি জাভা ইন্টারফেসের পদ্ধতিগুলি স্পষ্টত বিমূর্ত এবং এর বাস্তবায়ন থাকতে পারে না। একটি জাভা বিমূর্ত শ্রেণীর উদাহরণ পদ্ধতি থাকতে পারে যা একটি ডিফল্ট আচরণ প্রয়োগ করে।
  2. একটি জাভা ইন্টারফেসে ঘোষিত চলকগুলি ডিফল্টরূপে চূড়ান্ত। একটি বিমূর্ত শ্রেণিতে অ-চূড়ান্ত ভেরিয়েবল থাকতে পারে।
  3. একটি জাভা ইন্টারফেসের সদস্যরা ডিফল্টরূপে সর্বজনীন। একটি জাভা বিমূর্ত শ্রেণিতে শ্রেণীর সদস্যদের ব্যক্তিগত স্বাদ যেমন ব্যক্তিগত, সুরক্ষিত ইত্যাদি থাকতে পারে
  4. জাভা ইন্টারফেস মূল শব্দ "প্রয়োগগুলি" ব্যবহার করে প্রয়োগ করা উচিত; একটি জাভা বিমূর্ত শ্রেণীর শব্দটি "প্রসারিত" ব্যবহার করে প্রসারিত করা উচিত।
  5. একটি ইন্টারফেস অন্য জাভা ইন্টারফেসকে প্রসারিত করতে পারে কেবল একটি বিমূর্ত শ্রেণি অন্য জাভা শ্রেণি প্রসারিত করতে পারে এবং একাধিক জাভা ইন্টারফেস প্রয়োগ করতে পারে।
  6. একটি জাভা ক্লাস একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে তবে এটি কেবল একটি বিমূর্ত শ্রেণি প্রসারিত করতে পারে।
  7. ইন্টারফেস পুরোপুরি বিমূর্ত এবং তাত্ক্ষণিকভাবে স্থাপন করা যায় না; একটি জাভা বিমূর্ত শ্রেণিও তাত্ক্ষণিকভাবে চালু করা যায় না, তবে একটি প্রধান () উপস্থিত থাকলে তাকে আহ্বান করা যেতে পারে।
  8. জাভা বিমূর্ত শ্রেণীর সাথে তুলনা করে, জাভা ইন্টারফেসগুলি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়, কারণ এটির জন্য অতিরিক্ত দিকনির্দেশ প্রয়োজন।
  9. জাভাতে ইন্টারফেস এবং অ্যাবস্ট্রাক্ট ক্লাসটি হ'ল আপনি ইন্টারফেসে নন অ্যাবস্ট্রাক্ট পদ্ধতি তৈরি করতে পারবেন না, ইন্টারফেসের প্রতিটি পদ্ধতি ডিফল্ট অ্যাবস্ট্রাক্ট হয়, তবে আপনি বিমূর্ত শ্রেণিতে অ বিমূর্ত পদ্ধতি তৈরি করতে পারেন।
  10. জাভাতে অ্যাবস্ট্রাক্ট ক্লাস বনাম ইন্টারফেসটি হ'ল, টাইপ ঘোষণার জন্য ইন্টারফেসগুলি আরও ভাল উপযুক্ত এবং অ্যাবস্ট্রাক্ট ক্লাস কোড পুনরায় ব্যবহার এবং বিবর্তন দৃষ্টিভঙ্গির জন্য আরও উপযুক্ত।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.