বিমূর্ত শ্রেণীর পরিবর্তে এবং তার বিপরীতে কোনও ইন্টারফেস কখন ব্যবহার করবেন?


427

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

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


1
এই অনেক বলা হয়েছে stackoverflow.com/questions/56867/interface-vs-base-class
mmcdole

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

ক্লাসটি কী করবে তা আপনি নিশ্চিত না হয়ে যখন বিমূর্ত ব্যবহার করুন। আপনি যদি ইন্টারফেস ব্যবহার করুন।
উওর গামাহান

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

উত্তর:


431

আমি সে সম্পর্কে একটি নিবন্ধ লিখেছি:

বিমূর্ত ক্লাস এবং ইন্টারফেস

সারমর্ম:

আমরা যখন বিমূর্ত ক্লাস সম্পর্কে কথা বলি তখন আমরা কোনও বস্তুর ধরণের বৈশিষ্ট্যগুলি সংজ্ঞায়িত করি; একটি বস্তু কি তা নির্দিষ্ট করে ।

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


114
এই ery সহায়ক ছিল: Interfaces do not express something like "a Doberman is a type of dog and every dog can walk" but more like "this thing can walk"। আপনাকে ধন্যবাদ
এক্সেল

2
দেখে মনে হচ্ছে আপনার লিঙ্কটি মারা গেছে।
কিম আহ্লাস্ট্রোম মেইন ম্যাথিয়াসেন

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

1
ডানকান মালাশক, আসলেই নয়। জর্জের উত্তর আরও ভাল। অ্যালেক্সের উত্তরটি মেকানিক্সের দিকে মনোনিবেশ করে, যদিও জোর্জ শব্দার্থবিজ্ঞানের বিষয়ে আরও বেশি।
নজর মেরজা

8
আপনার নির্দিষ্ট উত্তরের আগে আমি বিবৃতিটি পছন্দ করি:Use abstract classes and inheritance if you can make the statement “A is a B”. Use interfaces if you can make the statement “A is capable of [doing] as”
এস 1 আর-ল্যাঞ্জেলোট

433

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


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

3
উদাহরণস্বরূপ, একটি বিমূর্ত বেস শ্রেণিটি টেম্পলেট পদ্ধতি ডিজাইনের প্যাটার্নের জন্য ব্যবহৃত হয়, অন্যদিকে কৌশল নকশা প্যাটার্নের জন্য একটি ইন্টারফেস ব্যবহৃত হয় ।
রায়েডওয়াল্ড

1
আমি মনে করি জর্জের সংক্ষিপ্তসারটি উভয়ের অস্তিত্বের পেছনে যদিও প্রাথমিক ব্যাখ্যা করেছে যখন অ্যালেক্সের উত্তর ফলাফলের পার্থক্য। আমি উভয়কে সঠিক উত্তর হিসাবে চিহ্নিত করতে পারতাম, তবে আমি এখনও জর্জের উত্তরকে পছন্দ করি।
চিরানতান

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

আমার কাছে, এই "একটি ভাল বিমূর্ত শ্রেণি কোডটি আবার লিখতে হবে তার পরিমাণ হ্রাস করবে কারণ এটির কার্যকারিতা বা রাষ্ট্র ভাগ করা যায়।" বিবৃতি উত্তরের মূল।
ডিভ তিওয়ারি

82

ব্যক্তিগতভাবে, আমার প্রায় কখনও অ্যাবস্ট্রাক্ট ক্লাস লেখার প্রয়োজন হয় না।

বেশিরভাগ সময় আমি অ্যাবস্ট্রাক্ট ক্লাসগুলি ব্যবহার করতে দেখি (ভুল), কারণ এটি বিমূর্ত শ্রেণির লেখক "টেম্পলেট পদ্ধতি" প্যাটার্নটি ব্যবহার করছেন।

"টেমপ্লেট পদ্ধতি" এর সমস্যাটি হ'ল এটি প্রায় সর্বদা কিছুটা পুনরায় প্রবেশ করে - "উত্পন্ন" শ্রেণিটি তার বেস শ্রেণীর যে "প্রয়োগ" হয় তা কেবল "বিমূর্ত" পদ্ধতি নয়, তবে বেস শ্রেণীর পাবলিক পদ্ধতি সম্পর্কেও জানে , যদিও বেশিরভাগ সময় তাদের কল করার প্রয়োজন হয় না।

(অতিরিক্ত সরলীকৃত) উদাহরণ:

abstract class QuickSorter
{
    public void Sort(object[] items)
    {
        // implementation code that somewhere along the way calls:
        bool less = compare(x,y);
        // ... more implementation code
    }
    abstract bool compare(object lhs, object rhs);
}

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

সুতরাং উদ্দেশ্যে ব্যবহার হ'ল কিছু:

class NameSorter : QuickSorter
{
    public bool compare(object lhs, object rhs)
    {
        // etc.
    }
}

এটির সাথে সমস্যা হ'ল আপনি দু'টি ধারণাকে অযৌক্তিকভাবে একসাথে করেছেন:

  1. দুটি আইটেমের তুলনা করার একটি উপায় (কোন আইটেমটি প্রথমে যাওয়া উচিত)
  2. বাছাইয়ের আইটেমগুলি (যেমন কুইকসোর্ট বনাম মার্জ সাজ্ট ইত্যাদি)

উপরের কোডে, তাত্ত্বিকভাবে, "তুলনা" পদ্ধতির লেখক পুনরায় প্রবেশের মাধ্যমে সুপারক্লাস "সাজান" পদ্ধতিতে আবার কল করতে পারেন ... যদিও বাস্তবে তারা এগুলি চান না বা প্রয়োজন হবে না।

এই অবিবাহিত সংযোগের জন্য আপনি যে মূল্য দিয়েছিলেন তা হ'ল সুপারক্লাস পরিবর্তন করা শক্ত এবং বেশিরভাগ ওও ভাষায়, রানটাইম এ এটি পরিবর্তন করা অসম্ভব।

বিকল্প পদ্ধতিটি হ'ল পরিবর্তে "কৌশল" ডিজাইনের ধরণটি ব্যবহার করুন:

interface IComparator
{
    bool compare(object lhs, object rhs);
}

class QuickSorter
{
    private readonly IComparator comparator;
    public QuickSorter(IComparator comparator)
    {
        this.comparator = comparator;
    }

    public void Sort(object[] items)
    {
        // usual code but call comparator.Compare();
    }
}

class NameComparator : IComparator
{
    bool compare(object lhs, object rhs)
    {
        // same code as before;
    }
}

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

"কুইকসোর্ট" ক্লাস এবং "নেমকম্পেরেটর" ব্যবহার করে আমরা "নাম বাছাই" বাস্তবায়ন করেছি এই সত্যটি "আড়াল করতে", আমরা এখনও কোথাও কারখানার পদ্ধতি লিখতে পারি:

ISorter CreateNameSorter()
{
    return new QuickSorter(new NameComparator());
}

যে কোনও সময় আপনার কোনও অ্যাবস্ট্রাক্ট বর্গ থাকলে আপনি এটি করতে পারেন ... বেস এবং উত্পন্ন শ্রেণীর মধ্যে প্রাকৃতিক পুনরায় প্রবেশের সম্পর্ক থাকা সত্ত্বেও এটি সাধারণত তাদের সুস্পষ্ট করার জন্য অর্থ প্রদান করে।

একটি চূড়ান্ত চিন্তা: আমরা উপরে যে সমস্ত কাজ করেছি তা হ'ল "কুইকসোর্ট" ফাংশন এবং "নেমকম্পায়ারেন্স" ফাংশন ব্যবহার করে একটি "নেমসোর্টিং" ফাংশন ... একটি ক্রিয়ামূলক প্রোগ্রামিং ভাষায়, প্রোগ্রামিংয়ের এই স্টাইলটি আরও প্রাকৃতিক হয়ে ওঠে, কম কোড সহ


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

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

ঠিক আছে, আমি এটি একটি বিশেষজ্ঞ সিস্টেমের জন্য একবার ব্যবহার করেছি যেখানে প্রক্রিয়াটি কিছুটা হ'ল 1 পান ill যেখানে প্রতিনিধি এবং 2 এবং 4 বেস ক্লাসে প্রয়োগ করা হয়।
হোর্হে কর্ডোবা

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

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

41

আপনি যদি জাভাটিকে ওওপি ভাষা হিসাবে দেখছেন,

" ইন্টারফেস পদ্ধতি বাস্তবায়ন সরবরাহ করে না " জাভা 8 লঞ্চের সাথে আর বৈধ নয়। এখন জাভা ডিফল্ট পদ্ধতিগুলির জন্য ইন্টারফেসে প্রয়োগকরণ সরবরাহ করে।

সহজ কথায়, আমি ব্যবহার করতে চাই

ইন্টারফেস: একাধিক সম্পর্কযুক্ত অবজেক্টের দ্বারা একটি চুক্তি কার্যকর করা। এটি " HAS A " ক্ষমতা সরবরাহ করে।

বিমূর্ত শ্রেণি: একাধিক সম্পর্কিত বস্তুর মধ্যে একই বা ভিন্ন আচরণ বাস্তবায়নের জন্য। এটি " আইএস এ " সম্পর্ক স্থাপন করে।

ওরাকল ওয়েবসাইটinterface এবং abstractশ্রেণীর মধ্যে মূল পার্থক্য সরবরাহ করে ।

বিমূর্ত ক্লাস ব্যবহার বিবেচনা করুন যদি:

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

ইন্টারফেস ব্যবহার বিবেচনা করুন যদি:

  1. আপনি আশা করেন যে সম্পর্কযুক্ত ক্লাসগুলি আপনার ইন্টারফেসটি কার্যকর করবে। উদাহরণস্বরূপ, অনেকগুলি সম্পর্কযুক্ত অবজেক্ট Serializableইন্টারফেস প্রয়োগ করতে পারে ।
  2. আপনি কোনও নির্দিষ্ট ডেটা ধরণের আচরণ নির্দিষ্ট করতে চান তবে কে তার আচরণটি প্রয়োগ করে তা নিয়ে উদ্বিগ্ন নন।
  3. আপনি একাধিক প্রকারের উত্তরাধিকারের সুযোগ নিতে চান।

উদাহরণ:

বিমূর্ত শ্রেণি ( একটি সম্পর্ক)

পাঠক একটি বিমূর্ত শ্রেণি।

বাফারডিডার হ'ল কReader

ফাইলরেডার হ'ল একটিReader

FileReaderএবং BufferedReaderসাধারণ উদ্দেশ্যে ব্যবহৃত হয়: ডেটা পড়া, এবং সেগুলি Readerক্লাসের মাধ্যমে সম্পর্কিত ।

ইন্টারফেস ( একটি ক্ষমতা আছে)

সিরিয়ালাইজযোগ্য একটি ইন্টারফেস।

ধরে নিন যে আপনার আবেদনে দুটি ক্লাস রয়েছে, যা Serializableইন্টারফেস প্রয়োগ করছে

Employee implements Serializable

Game implements Serializable

এখানে আপনি এবং এর Serializableমধ্যে ইন্টারফেসের মাধ্যমে কোনও সম্পর্ক স্থাপন করতে পারবেন না , যা বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয়। উভয়ই রাজ্য সিরিয়ালাইজ করতে সক্ষম এবং সেখানে তুলনা শেষ হয়।EmployeeGame

এই পোস্টে একবার দেখুন:

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


40

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

অ্যাবস্ট্রাক্ট ক্লাসগুলি আপনাকে একটি নীলনকশা তৈরি করার অনুমতি দেয় এবং আপনাকে অতিরিক্তভাবে তার সমস্ত বংশধরদের মালিকানাধীন বৈশিষ্ট্য এবং পদ্ধতিগুলি (রূপায়ণ) করতে দেয়।

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

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

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


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

আমি আপনার লাইটব্লব মুহুর্ত সম্পর্কে সম্পূর্ণ সম্মত: "এপিআই (নটারফেস) বিভিন্ন প্রয়োজনের সংমিশ্রণে / আকারে তাদের প্রয়োজন অনুসারে"! খুব ভাল পয়েন্ট করতে।
ট্রেভর বয়েড স্মিথ

39

আমার দুই সেন্ট:

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

অন্যদিকে, একটি বিমূর্ত শ্রেণিতে কোড থাকতে পারে এবং এমন কিছু পদ্ধতি থাকতে পারে যা বিমূর্ত হিসাবে চিহ্নিত করা হবে যা উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণিকে প্রয়োগ করতে হবে।

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

উদাহরণ (একটি খুব প্রাথমিক একজন!): একটি বেস বর্গ নামক গ্রাহক যা মত বিমূর্ত পদ্ধতি আছে বিবেচনা করুন CalculatePayment(), CalculateRewardPoints()এবং মত কিছু অ বিমূর্ত পদ্ধতি GetName(), SavePaymentDetails()

এর মত specialized শ্রেণীর RegularCustomer এবং GoldCustomerথেকে উত্তরাধিকার লাভ করবে Customerবেস বর্গ এবং তাদের নিজস্ব বাস্তবায়ন CalculatePayment()এবং CalculateRewardPoints()পদ্ধতি যুক্তি, কিন্তু পুনঃ-ব্যবহার GetName()এবং SavePaymentDetails()পদ্ধতি।

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

সমস্ত বিমূর্ত সদস্যের সাথে একটি বিমূর্ত শ্রেণি একটি ইন্টারফেসের অনুরূপ।


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

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

30

আপনার মনের ধারণাটি পরিষ্কার হয়ে থাকলে খুব সাধারণ জিনিসটি কখন করবেন।

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

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

আমি আশা করি আমি পরিষ্কার।


11

1. আপনি যদি এমন কিছু তৈরি করছেন যা সম্পর্কিত সম্পর্কযুক্ত ক্লাসগুলিতে সাধারণ কার্যকারিতা সরবরাহ করে তবে একটি ইন্টারফেস ব্যবহার করুন।

২. যদি আপনি এমন পদার্থের জন্য কিছু তৈরি করছেন যা শ্রেণিবিন্যাসের সাথে নিবিড়ভাবে সম্পর্কিত, একটি বিমূর্ত শ্রেণি ব্যবহার করুন।


10

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

http://codeofdoom.com/wordpress/2009/02/12/learn-this-when-to-use-an-abstract-class-and-an-interface/


7

আমি মনে করি এটি রাখার সর্বাধিক সংক্ষিপ্ত উপায়টি নিম্নলিখিত:

ভাগ করা বৈশিষ্ট্য => বিমূর্ত শ্রেণি।
ভাগ করা কার্যকারিতা => ইন্টারফেস।

এবং এটি কম সংক্ষেপে রাখা ...

বিমূর্ত শ্রেণির উদাহরণ:

public abstract class BaseAnimal
{
    public int NumberOfLegs { get; set; }

    protected BaseAnimal(int numberOfLegs)
    {
        NumberOfLegs = numberOfLegs;
    }
}

public class Dog : BaseAnimal
{
    public Dog() : base(4) { }
}

public class Human : BaseAnimal 
{
    public Human() : base(2) { }
}

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

public static int CountAllLegs(List<BaseAnimal> animals)
{
    int legCount = 0;
    foreach (BaseAnimal animal in animals)
    {
        legCount += animal.NumberOfLegs;
    }
    return legCount;
}

ইন্টারফেস উদাহরণ:

public interface IMakeSound
{
    void MakeSound();
}

public class Car : IMakeSound
{
    public void MakeSound() => Console.WriteLine("Vroom!");
}

public class Vuvuzela : IMakeSound
{
    public void MakeSound() => Console.WriteLine("VZZZZZZZZZZZZZ!");        
}

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

List<IMakeSound> soundMakers = new List<ImakeSound>();
soundMakers.Add(new Car());
soundMakers.Add(new Vuvuzela());
soundMakers.Add(new Car());
soundMakers.Add(new Vuvuzela());
soundMakers.Add(new Vuvuzela());

foreach (IMakeSound soundMaker in soundMakers)
{
    soundMaker.MakeSound();
}

আপনি কি বলতে পারেন যে আউটপুট হবে কি?

শেষ পর্যন্ত, আপনি দুটি একত্রিত করতে পারেন।

সংযুক্ত উদাহরণ:

public interface IMakeSound
{
    void MakeSound();
}

public abstract class BaseAnimal : IMakeSound
{
    public int NumberOfLegs { get; set; }

    protected BaseAnimal(int numberOfLegs)
    {
        NumberOfLegs = numberOfLegs;
    }

    public abstract void MakeSound();
}

public class Cat : BaseAnimal
{
    public Cat() : base(4) { }

    public override void MakeSound() => Console.WriteLine("Meow!");
}

public class Human : BaseAnimal 
{
    public Human() : base(2) { }

    public override void MakeSound() => Console.WriteLine("Hello, world!");
}

এখানে, আমরা সকলের BaseAnimalজন্য একটি শব্দ করা প্রয়োজন, তবে আমরা এখনও এটির বাস্তবায়ন জানি না। এই জাতীয় ক্ষেত্রে, আমরা ইন্টারফেস বাস্তবায়ন বিমূর্ত করতে পারি এবং এর প্রয়োগটিকে এর সাবক্লাসে অর্পণ করতে পারি।

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


7

ইন্টারফেসের চেয়ে কোনও বিমূর্ত শ্রেণিকে কখন পছন্দ করবেন?

  1. যদি কোনও প্রোগ্রাম / প্রকল্পের সারা জীবন জুড়ে একটি বেস ক্লাস আপডেট করার পরিকল্পনা করে, তবে বেস ক্লাসটি একটি বিমূর্ত শ্রেণি হিসাবে দেওয়া ভাল is
  2. শ্রেণিবদ্ধের সাথে ঘনিষ্ঠভাবে সম্পর্কিত বস্তুর জন্য যদি কেউ একটি মেরুদণ্ড তৈরি করার চেষ্টা করে থাকে তবে এটি একটি বিমূর্ত শ্রেণি ব্যবহার করা অত্যন্ত উপকারী

বিমূর্ত শ্রেণীর চেয়ে ইন্টারফেসটি কখন পছন্দ করবেন?

  1. যদি কেউ একটি বিশাল শ্রেণিবৃদ্ধিক কাঠামোর সাথে কাজ করে না, তবে ইন্টারফেসগুলি একটি দুর্দান্ত পছন্দ হবে
  2. একাধিক উত্তরাধিকার বিমূর্ত ক্লাস (ডায়মন্ড সমস্যা) দ্বারা সমর্থিত না হওয়ায় ইন্টারফেসগুলি দিনটি বাঁচাতে পারে

প্রায় এক দশক পুরানো প্রশ্নের 22 তম উত্তরের কী প্রয়োজন তা আপনি কী ভাবেন?
jonrsharpe

3
একই ধরণের চিন্তাভাবনা যা আমাকে প্রশ্নের উত্তর দেওয়ার জন্য অনুসন্ধান করতে বাধ্য করেছিল।
সত্য 23

1
এফডাব্লুআইডাব্লু, আমি এই উত্তরটি সত্যিই পছন্দ করি।
ব্রেন্ট রাইটেনহাউস

6

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

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

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

থেকে অনুলিপি করা হয়েছে:
http://msdn.microsoft.com/en-us/library/scsyfw1d%28v=vs.71%29.aspx


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

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

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

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

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

3

যদি এই বিবৃতিগুলির কোনও আপনার অবস্থার সাথে প্রযোজ্য হয় তবে বিমূর্ত শ্রেণীর ব্যবহারগুলি বিবেচনা করুন :

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

ইন্টারফেস ব্যবহার বিবেচনা করুন যদি এই বিবৃতিগুলির কোনও আপনার পরিস্থিতিতে প্রযোজ্য:

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

সূত্র


2

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


2

আমার জন্য, আমি অনেক ক্ষেত্রে ইন্টারফেসের সাথে যেতে চাই। তবে আমি কিছু ক্ষেত্রে অ্যাবস্ট্রাক্ট ক্লাস পছন্দ করি।

ওওতে ক্লাসগুলি জেনারাল করে প্রয়োগকে বোঝায়। আমি অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করি যখন আমি বাচ্চাদের কিছু প্রয়োগের বিবরণ জোর করতে চাই অন্যথায় আমি ইন্টারফেসের সাথে যাই।

অবশ্যই, অ্যাবস্ট্রাক্ট ক্লাসগুলি কার্যকরভাবে প্রয়োগ করার ক্ষেত্রেই নয় তবে অনেকগুলি সম্পর্কিত শ্রেণীর মধ্যে কিছু নির্দিষ্ট বিবরণ ভাগ করে নেওয়ার ক্ষেত্রেও কার্যকর।


1

আপনি কিছু বেসিক প্রয়োগ বাস্তবায়ন করতে চাইলে একটি বিমূর্ত শ্রেণি ব্যবহার করুন।


1
ধন্যবাদ সেবাস্তিয়ান তবে আমার যদি বেসিক প্রয়োগের প্রয়োজন হয় না? যদি কোনও বিমূর্ত শ্রেণি এবং ইন্টারফেস একই হয় তবে তাদের মধ্যে এই যদি কেবল পার্থক্য হয়? কেন পার্থক্য আছে?
চিরন্তন

1
কারণ কিছু ভাষার ইন্টারফেস নেই - সি ++।
jmucchiello

1

জাভাতে আপনি একটি (বিমূর্ত) শ্রেণি থেকে "সরবরাহ" কার্যকারিতা অর্জন করতে পারেন এবং কার্যকারিতা "নিশ্চিত করতে" আপনি অনেকগুলি ইন্টারফেস প্রয়োগ করতে পারেন


ইঙ্গিত: আপনি যদি একটি বিমূর্ত শ্রেণি এবং একটি ইন্টারফেস থেকে উত্তরাধিকারী হতে চান, নিশ্চিত হন, বিমূর্ত শ্রেণি ইন্টারফেসটি প্রয়োগ করে
Andreas Niedermair

1

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

আপনি যেভাবে পারিবেন সেই উত্তরাধিকারের তুলনায় আপনার রচনা (নির্ভরতা ইনজেকশনের মাধ্যমে) চেষ্টা করা উচিত এবং লক্ষ করুন যে ইন্টারফেসগুলি চুক্তি হচ্ছে ইউনিট-টেস্টিং, উদ্বেগের বিচ্ছেদ এবং একাধিক উত্তরাধিকারকে যেভাবে অ্যাবস্ট্রাক্টস পারে না তা সমর্থন করে support


1

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


0

এটি করা খুব কঠিন কল হতে পারে ...

আমি যে পয়েন্টারটি দিতে পারি: একটি অবজেক্ট অনেকগুলি ইন্টারফেস বাস্তবায়িত করতে পারে, যখন কোনও বস্তু কেবল একটি বেস ক্লাসের উত্তরাধিকারী হতে পারে (সি # এর মতো আধুনিক ওও ভাষায় আমি জানি যে সি ++ এর একাধিক উত্তরাধিকার রয়েছে - তবে এটি কি ভ্রূণু নয়?)


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

আসলে আমি তা করি নি, একাধিক উত্তরাধিকার হ'ল সত্যই আমাদের মধ্যে গিক্সের মধ্যে একটি বিতর্ক স্পর্কার, আমি একেবারে নিম্নমানের কোনও কারণ দেখতে পাই না। আসলে আমি আপনার উত্তর upvated।
মার্টিজন লারম্যান

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

এই উত্তরটি ডিজাইনের পার্থক্যের চেয়ে সিনট্যাক্টিকাল পার্থক্য বেশি। আমি মনে করি তিনি একটি ডিজাইনের পার্থক্য জিজ্ঞাসা করছেন
প্রমোদ সেত্তেলুর

0

একটি বিমূর্ত শ্রেণীর প্রয়োগ থাকতে পারে।

একটি ইন্টারফেসের বাস্তবায়ন নেই, এটি কেবল একধরণের চুক্তিটি সংজ্ঞায়িত করে।

কিছু ভাষা নির্ভর পার্থক্যও থাকতে পারে: উদাহরণস্বরূপ সি # এর একাধিক উত্তরাধিকার নেই, তবে এক শ্রেণিতে একাধিক ইন্টারফেস প্রয়োগ করা যেতে পারে।


আপনি যখন বলেন, "এক ধরণের চুক্তি", আপনি কি ওয়েব পরিষেবাদির মতো বলতে চান?
চিরন্তন

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

-1

বেসিক থাম্ব রুল: হ'ল "বিশেষ্যগুলি" অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন এবং "ক্রিয়াপদ" ইন্টারফেস ব্যবহার করুন

উদাহরণস্বরূপ: carএকটি বিমূর্ত শ্রেণি এবং drive, আমরা এটি একটি ইন্টারফেস করতে পারি।


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