এটি জেনেরিক ওওপি প্রশ্ন হতে পারে। আমি তাদের ব্যবহারের ভিত্তিতে একটি ইন্টারফেস এবং একটি বিমূর্ত শ্রেণীর মধ্যে জেনেরিক তুলনা করতে চাই।
কেউ কখন একটি ইন্টারফেস ব্যবহার করতে চায় এবং কখন একটি বিমূর্ত শ্রেণি ব্যবহার করতে চায় ?
এটি জেনেরিক ওওপি প্রশ্ন হতে পারে। আমি তাদের ব্যবহারের ভিত্তিতে একটি ইন্টারফেস এবং একটি বিমূর্ত শ্রেণীর মধ্যে জেনেরিক তুলনা করতে চাই।
কেউ কখন একটি ইন্টারফেস ব্যবহার করতে চায় এবং কখন একটি বিমূর্ত শ্রেণি ব্যবহার করতে চায় ?
উত্তর:
আমি সে সম্পর্কে একটি নিবন্ধ লিখেছি:
সারমর্ম:
আমরা যখন বিমূর্ত ক্লাস সম্পর্কে কথা বলি তখন আমরা কোনও বস্তুর ধরণের বৈশিষ্ট্যগুলি সংজ্ঞায়িত করি; একটি বস্তু কি তা নির্দিষ্ট করে ।
আমরা যখন কোনও ইন্টারফেসের বিষয়ে কথা বলি এবং যে ক্ষমতাগুলি সরবরাহ করার প্রতিশ্রুতি দিয়েছি তার সংজ্ঞা দিই, আমরা অবজেক্টটি কী করতে পারে সে সম্পর্কে একটি চুক্তি স্থাপনের কথা বলছি ।
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"
। আপনাকে ধন্যবাদ
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”
একটি বিমূর্ত শ্রেণীর অংশীদারিত্বের অবস্থা বা কার্যকারিতা থাকতে পারে। একটি ইন্টারফেস কেবলমাত্র রাষ্ট্র বা কার্যকারিতা সরবরাহ করার প্রতিশ্রুতি। একটি ভাল বিমূর্ত শ্রেণি কোডটির পরিমাণ কমিয়ে দেবে যা আবার লিখতে হবে কারণ এটির কার্যকারিতা বা রাষ্ট্র ভাগ করা যায়। ইন্টারফেসে ভাগ করার মতো কোনও সংজ্ঞায়িত তথ্য নেই
ব্যক্তিগতভাবে, আমার প্রায় কখনও অ্যাবস্ট্রাক্ট ক্লাস লেখার প্রয়োজন হয় না।
বেশিরভাগ সময় আমি অ্যাবস্ট্রাক্ট ক্লাসগুলি ব্যবহার করতে দেখি (ভুল), কারণ এটি বিমূর্ত শ্রেণির লেখক "টেম্পলেট পদ্ধতি" প্যাটার্নটি ব্যবহার করছেন।
"টেমপ্লেট পদ্ধতি" এর সমস্যাটি হ'ল এটি প্রায় সর্বদা কিছুটা পুনরায় প্রবেশ করে - "উত্পন্ন" শ্রেণিটি তার বেস শ্রেণীর যে "প্রয়োগ" হয় তা কেবল "বিমূর্ত" পদ্ধতি নয়, তবে বেস শ্রেণীর পাবলিক পদ্ধতি সম্পর্কেও জানে , যদিও বেশিরভাগ সময় তাদের কল করার প্রয়োজন হয় না।
(অতিরিক্ত সরলীকৃত) উদাহরণ:
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.
}
}
এটির সাথে সমস্যা হ'ল আপনি দু'টি ধারণাকে অযৌক্তিকভাবে একসাথে করেছেন:
উপরের কোডে, তাত্ত্বিকভাবে, "তুলনা" পদ্ধতির লেখক পুনরায় প্রবেশের মাধ্যমে সুপারক্লাস "সাজান" পদ্ধতিতে আবার কল করতে পারেন ... যদিও বাস্তবে তারা এগুলি চান না বা প্রয়োজন হবে না।
এই অবিবাহিত সংযোগের জন্য আপনি যে মূল্য দিয়েছিলেন তা হ'ল সুপারক্লাস পরিবর্তন করা শক্ত এবং বেশিরভাগ ওও ভাষায়, রানটাইম এ এটি পরিবর্তন করা অসম্ভব।
বিকল্প পদ্ধতিটি হ'ল পরিবর্তে "কৌশল" ডিজাইনের ধরণটি ব্যবহার করুন:
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());
}
যে কোনও সময় আপনার কোনও অ্যাবস্ট্রাক্ট বর্গ থাকলে আপনি এটি করতে পারেন ... বেস এবং উত্পন্ন শ্রেণীর মধ্যে প্রাকৃতিক পুনরায় প্রবেশের সম্পর্ক থাকা সত্ত্বেও এটি সাধারণত তাদের সুস্পষ্ট করার জন্য অর্থ প্রদান করে।
একটি চূড়ান্ত চিন্তা: আমরা উপরে যে সমস্ত কাজ করেছি তা হ'ল "কুইকসোর্ট" ফাংশন এবং "নেমকম্পায়ারেন্স" ফাংশন ব্যবহার করে একটি "নেমসোর্টিং" ফাংশন ... একটি ক্রিয়ামূলক প্রোগ্রামিং ভাষায়, প্রোগ্রামিংয়ের এই স্টাইলটি আরও প্রাকৃতিক হয়ে ওঠে, কম কোড সহ
আপনি যদি জাভাটিকে ওওপি ভাষা হিসাবে দেখছেন,
" ইন্টারফেস পদ্ধতি বাস্তবায়ন সরবরাহ করে না " জাভা 8 লঞ্চের সাথে আর বৈধ নয়। এখন জাভা ডিফল্ট পদ্ধতিগুলির জন্য ইন্টারফেসে প্রয়োগকরণ সরবরাহ করে।
সহজ কথায়, আমি ব্যবহার করতে চাই
ইন্টারফেস: একাধিক সম্পর্কযুক্ত অবজেক্টের দ্বারা একটি চুক্তি কার্যকর করা। এটি " HAS A " ক্ষমতা সরবরাহ করে।
বিমূর্ত শ্রেণি: একাধিক সম্পর্কিত বস্তুর মধ্যে একই বা ভিন্ন আচরণ বাস্তবায়নের জন্য। এটি " আইএস এ " সম্পর্ক স্থাপন করে।
ওরাকল ওয়েবসাইটinterface
এবং abstract
শ্রেণীর মধ্যে মূল পার্থক্য সরবরাহ করে ।
বিমূর্ত ক্লাস ব্যবহার বিবেচনা করুন যদি:
ইন্টারফেস ব্যবহার বিবেচনা করুন যদি:
Serializable
ইন্টারফেস প্রয়োগ করতে পারে ।উদাহরণ:
বিমূর্ত শ্রেণি ( একটি সম্পর্ক)
পাঠক একটি বিমূর্ত শ্রেণি।
বাফারডিডার হ'ল কReader
ফাইলরেডার হ'ল একটিReader
FileReader
এবং BufferedReader
সাধারণ উদ্দেশ্যে ব্যবহৃত হয়: ডেটা পড়া, এবং সেগুলি Reader
ক্লাসের মাধ্যমে সম্পর্কিত ।
ইন্টারফেস ( একটি ক্ষমতা আছে)
সিরিয়ালাইজযোগ্য একটি ইন্টারফেস।
ধরে নিন যে আপনার আবেদনে দুটি ক্লাস রয়েছে, যা Serializable
ইন্টারফেস প্রয়োগ করছে
Employee implements Serializable
Game implements Serializable
এখানে আপনি এবং এর Serializable
মধ্যে ইন্টারফেসের মাধ্যমে কোনও সম্পর্ক স্থাপন করতে পারবেন না , যা বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয়। উভয়ই রাজ্য সিরিয়ালাইজ করতে সক্ষম এবং সেখানে তুলনা শেষ হয়।Employee
Game
এই পোস্টে একবার দেখুন:
একটি ইন্টারফেস এবং একটি বিমূর্ত শ্রেণীর মধ্যে পার্থক্যটি আমি কীভাবে ব্যাখ্যা করব?
ঠিক আছে, এটিকে নিজেই "কুঁচকে" রেখেছেন - এখানে এটি সাধারণ লোকের শর্তাবলী - (আমি ভুল হলে আমাকে সংশোধন করতে নির্দ্বিধায়) - আমি জানি এই বিষয়টি খুব বেশি, তবে অন্য কেউ হয়ত একদিন এটিকে হোঁচট খেতে পারে ...
অ্যাবস্ট্রাক্ট ক্লাসগুলি আপনাকে একটি নীলনকশা তৈরি করার অনুমতি দেয় এবং আপনাকে অতিরিক্তভাবে তার সমস্ত বংশধরদের মালিকানাধীন বৈশিষ্ট্য এবং পদ্ধতিগুলি (রূপায়ণ) করতে দেয়।
অন্যদিকে একটি ইন্টারফেস কেবল আপনাকে ঘোষণার অনুমতি দেয় যে আপনি সম্পত্তি এবং / অথবা প্রদত্ত নাম সহ পদ্ধতিগুলি এটি প্রয়োগকারী সমস্ত শ্রেণিতে বিদ্যমান থাকতে চান - তবে আপনাকে কীভাবে এটি প্রয়োগ করা উচিত তা নির্দিষ্ট করে না। এছাড়াও, একটি শ্রেণি অনেকগুলি ইন্টারফেস প্রয়োগ করতে পারে তবে কেবলমাত্র একটি বিমূর্ত শ্রেণি প্রসারিত করতে পারে। একটি ইন্টারফেস একটি উচ্চ স্তরের আর্কিটেকচারাল সরঞ্জামের বেশি (যা আপনি যদি নকশার ধরণগুলি ধরতে শুরু করেন তবে এটি স্পষ্ট হয়ে যায়) - একটি অ্যাবস্ট্রাক্ট উভয় শিবিরে একটি পা রাখে এবং কিছু নোংরা কাজও সম্পাদন করতে পারে।
একে অপরকে কেন ব্যবহার করবেন? প্রাক্তন বংশধরদের আরও দৃ concrete় সংজ্ঞা দেওয়ার অনুমতি দেয় - পরেরটি বৃহত্তর পলিমারফিজমের অনুমতি দেয় । এই শেষ পয়েন্টটি শেষ ব্যবহারকারী / কোডারের কাছে গুরুত্বপূর্ণ, যারা এপি আই (নটারফেস) বিভিন্ন প্রয়োজনীয় সংমিশ্রণ / আকারে তাদের প্রয়োজন অনুসারে প্রয়োগ করতে এই তথ্যটি ব্যবহার করতে পারেন।
আমি মনে করি এটি আমার জন্য "লাইটবুল্ব" মুহুর্ত ছিল - লেখকের দৃষ্টিভঙ্গি থেকে কম ইন্টারফেস সম্পর্কে চিন্তা করুন এবং পরে কোনও প্রকল্পে বাস্তবায়ন সংযোজনকারী, বা কোনও এপিআই প্রসারিত করার পরে শৃঙ্খলে আসছেন এমন কোনও কোডার এর চেয়ে বেশি ।
আমার দুই সেন্ট:
একটি ইন্টারফেস মূলত একটি চুক্তি সংজ্ঞায়িত করে, যে কোনও বাস্তবায়নকারী শ্রেণিকে অবশ্যই মেনে চলতে হবে (ইন্টারফেস সদস্যদের প্রয়োগ করতে হবে)। এটিতে কোনও কোড নেই।
অন্যদিকে, একটি বিমূর্ত শ্রেণিতে কোড থাকতে পারে এবং এমন কিছু পদ্ধতি থাকতে পারে যা বিমূর্ত হিসাবে চিহ্নিত করা হবে যা উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণিকে প্রয়োগ করতে হবে।
বিরল পরিস্থিতি আমি অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করেছি যখন আমার কিছু ডিফল্ট কার্যকারিতা থাকে যে উত্তরাধিকারী বর্গটি ওভাররাইডে আকর্ষণীয় নাও হতে পারে, একটি বিমূর্ত বেস ক্লাস বলে, কিছু বিশেষ শ্রেণীর যে অংশটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
উদাহরণ (একটি খুব প্রাথমিক একজন!): একটি বেস বর্গ নামক গ্রাহক যা মত বিমূর্ত পদ্ধতি আছে বিবেচনা করুন CalculatePayment()
, CalculateRewardPoints()
এবং মত কিছু অ বিমূর্ত পদ্ধতি GetName()
, SavePaymentDetails()
।
এর মত specialized শ্রেণীর RegularCustomer
এবং GoldCustomer
থেকে উত্তরাধিকার লাভ করবে Customer
বেস বর্গ এবং তাদের নিজস্ব বাস্তবায়ন CalculatePayment()
এবং CalculateRewardPoints()
পদ্ধতি যুক্তি, কিন্তু পুনঃ-ব্যবহার GetName()
এবং SavePaymentDetails()
পদ্ধতি।
পুরানো সংস্করণ ব্যবহার করা শিশু ক্লাসগুলিকে প্রভাবিত না করে আপনি একটি বিমূর্ত ক্লাসে (আরও বিমূর্ত পদ্ধতিতে) আরও কার্যকারিতা যুক্ত করতে পারেন। একটি ইন্টারফেসে পদ্ধতি যুক্ত করার ফলে এটি প্রয়োগ করা সমস্ত শ্রেণীর উপর প্রভাব ফেলবে কারণ তাদের এখন নতুন যুক্ত হওয়া ইন্টারফেস সদস্যদের প্রয়োগ করতে হবে।
সমস্ত বিমূর্ত সদস্যের সাথে একটি বিমূর্ত শ্রেণি একটি ইন্টারফেসের অনুরূপ।
আপনার মনের ধারণাটি পরিষ্কার হয়ে থাকলে খুব সাধারণ জিনিসটি কখন করবেন।
বিমূর্ত শ্রেণিগুলি উত্পন্ন করা যেতে পারে যেখানে ইন্টারফেসগুলি প্রয়োগ করা যেতে পারে। দুজনের মধ্যে কিছুটা পার্থক্য রয়েছে। আপনি যখন একটি বিমূর্ত শ্রেণি সংগ্রহ করেন, তখন উত্পন্ন শ্রেণি এবং বেস শ্রেণীর মধ্যে সম্পর্ক 'একটি' সম্পর্ক। উদাহরণস্বরূপ, একটি কুকুর একটি প্রাণী, একটি মেষ একটি প্রাণী যার অর্থ একটি উত্পন্ন শ্রেণি বেস শ্রেণীর কিছু সম্পত্তি উত্তরাধিকার সূত্রে প্রাপ্ত।
ইন্টারফেস বাস্তবায়নের ক্ষেত্রে, সম্পর্কটি "হতে পারে"। উদাহরণস্বরূপ, একটি কুকুর একটি গুপ্তচর কুকুর হতে পারে। একটি কুকুর একটি সার্কাস কুকুর হতে পারে। একটি কুকুর একটি রেস কুকুর হতে পারে। যার অর্থ আপনি কিছু অর্জনের জন্য কিছু নির্দিষ্ট পদ্ধতি প্রয়োগ করেন।
আমি আশা করি আমি পরিষ্কার।
1. আপনি যদি এমন কিছু তৈরি করছেন যা সম্পর্কিত সম্পর্কযুক্ত ক্লাসগুলিতে সাধারণ কার্যকারিতা সরবরাহ করে তবে একটি ইন্টারফেস ব্যবহার করুন।
২. যদি আপনি এমন পদার্থের জন্য কিছু তৈরি করছেন যা শ্রেণিবিন্যাসের সাথে নিবিড়ভাবে সম্পর্কিত, একটি বিমূর্ত শ্রেণি ব্যবহার করুন।
আমি কখন একটি বিমূর্ত শ্রেণি ব্যবহার করব এবং কখন একটি ইন্টারফেস ব্যবহার করব তার একটি নিবন্ধ লিখেছিলাম। "একটি আইএস-এ ... এবং একজন ক্যান-ডিও ..." ব্যতীত তাদের মধ্যে আরও অনেক পার্থক্য রয়েছে। আমার কাছে, সেগুলি উত্তরযুক্ত are আমি তাদের কয়েকটি ব্যবহার করার সময় কয়েকটি কারণ উল্লেখ করছি। আশা করি এটা সাহায্য করবে.
আমি মনে করি এটি রাখার সর্বাধিক সংক্ষিপ্ত উপায়টি নিম্নলিখিত:
ভাগ করা বৈশিষ্ট্য => বিমূর্ত শ্রেণি।
ভাগ করা কার্যকারিতা => ইন্টারফেস।
এবং এটি কম সংক্ষেপে রাখা ...
বিমূর্ত শ্রেণির উদাহরণ:
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
জন্য একটি শব্দ করা প্রয়োজন, তবে আমরা এখনও এটির বাস্তবায়ন জানি না। এই জাতীয় ক্ষেত্রে, আমরা ইন্টারফেস বাস্তবায়ন বিমূর্ত করতে পারি এবং এর প্রয়োগটিকে এর সাবক্লাসে অর্পণ করতে পারি।
একটি শেষ কথা, মনে রাখবেন যে কীভাবে বিমূর্ত শ্রেণীর উদাহরণে আমরা বিভিন্ন বস্তুর অংশীদারি বৈশিষ্ট্যগুলি পরিচালনা করতে সক্ষম হয়েছি এবং ইন্টারফেসের উদাহরণে আমরা বিভিন্ন বস্তুর অংশীদারি কার্যকারিতা প্রার্থনা করতে সক্ষম হয়েছি? এই শেষ উদাহরণে, আমরা উভয় করতে পারে।
ইন্টারফেসের চেয়ে কোনও বিমূর্ত শ্রেণিকে কখন পছন্দ করবেন?
বিমূর্ত শ্রেণীর চেয়ে ইন্টারফেসটি কখন পছন্দ করবেন?
ক্লাসগুলি কেবলমাত্র একটি বেস ক্লাসের উত্তরাধিকারী হতে পারে, সুতরাং আপনি যদি ক্লাসের একটি গ্রুপকে পলিমারফিজম সরবরাহ করতে অ্যাবস্ট্রাক্ট ক্লাসগুলি ব্যবহার করতে চান তবে তাদের অবশ্যই সমস্ত শ্রেণি থেকে উত্তরাধিকারী হতে হবে। বিমূর্ত ক্লাসগুলি ইতিমধ্যে কার্যকর করা সদস্যদেরও সরবরাহ করতে পারে। অতএব, আপনি একটি বিমূর্ত শ্রেণীর সাথে নির্দিষ্ট পরিমাণে অভিন্ন কার্যকারিতা নিশ্চিত করতে পারেন, তবে কোনও ইন্টারফেসের মাধ্যমে পারবেন না।
আপনার উপাদানগুলির পলিমারফিজম সরবরাহের জন্য কোনও ইন্টারফেস বা একটি বিমূর্ত শ্রেণি ব্যবহার করবেন কিনা তা সিদ্ধান্ত নিতে আপনাকে সহায়তা করার জন্য এখানে কয়েকটি প্রস্তাবনা রয়েছে।
থেকে অনুলিপি করা হয়েছে:
http://msdn.microsoft.com/en-us/library/scsyfw1d%28v=vs.71%29.aspx
যদি এই বিবৃতিগুলির কোনও আপনার অবস্থার সাথে প্রযোজ্য হয় তবে বিমূর্ত শ্রেণীর ব্যবহারগুলি বিবেচনা করুন :
ইন্টারফেস ব্যবহার বিবেচনা করুন যদি এই বিবৃতিগুলির কোনও আপনার পরিস্থিতিতে প্রযোজ্য:
উত্তরগুলি ভাষার মধ্যে পৃথক হয়। উদাহরণস্বরূপ, জাভাতে একটি শ্রেণি একাধিক ইন্টারফেস প্রয়োগ করতে পারে (উত্তরাধিকার সূত্রে) তবে কেবলমাত্র একটি বিমূর্ত শ্রেণীর কাছ থেকে উত্তরাধিকারী। সুতরাং ইন্টারফেস আপনাকে আরও নমনীয়তা দেয়। তবে এটি সি ++ তে সত্য নয়।
আমার জন্য, আমি অনেক ক্ষেত্রে ইন্টারফেসের সাথে যেতে চাই। তবে আমি কিছু ক্ষেত্রে অ্যাবস্ট্রাক্ট ক্লাস পছন্দ করি।
ওওতে ক্লাসগুলি জেনারাল করে প্রয়োগকে বোঝায়। আমি অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করি যখন আমি বাচ্চাদের কিছু প্রয়োগের বিবরণ জোর করতে চাই অন্যথায় আমি ইন্টারফেসের সাথে যাই।
অবশ্যই, অ্যাবস্ট্রাক্ট ক্লাসগুলি কার্যকরভাবে প্রয়োগ করার ক্ষেত্রেই নয় তবে অনেকগুলি সম্পর্কিত শ্রেণীর মধ্যে কিছু নির্দিষ্ট বিবরণ ভাগ করে নেওয়ার ক্ষেত্রেও কার্যকর।
আপনি কিছু বেসিক প্রয়োগ বাস্তবায়ন করতে চাইলে একটি বিমূর্ত শ্রেণি ব্যবহার করুন।
জাভাতে আপনি একটি (বিমূর্ত) শ্রেণি থেকে "সরবরাহ" কার্যকারিতা অর্জন করতে পারেন এবং কার্যকারিতা "নিশ্চিত করতে" আপনি অনেকগুলি ইন্টারফেস প্রয়োগ করতে পারেন
বিশুদ্ধরূপে উত্তরাধিকার ভিত্তিতে, আপনি একটি সারাংশ যেখানে আপনি পরিষ্কারভাবে বংশধর, বিমূর্ত সম্পর্ক সংজ্ঞায়িত করছি (অর্থাত পশু> বিড়াল) এবং / ব্যবহার করুন অথবা ভার্চুয়াল বা অ-সর্বজনীন বৈশিষ্ট্য উত্তরাধিকার, বিশেষ করে ভাগ রাজ্য (করতে হবে যা ইন্টারফেস সমর্থন করে না )।
আপনি যেভাবে পারিবেন সেই উত্তরাধিকারের তুলনায় আপনার রচনা (নির্ভরতা ইনজেকশনের মাধ্যমে) চেষ্টা করা উচিত এবং লক্ষ করুন যে ইন্টারফেসগুলি চুক্তি হচ্ছে ইউনিট-টেস্টিং, উদ্বেগের বিচ্ছেদ এবং একাধিক উত্তরাধিকারকে যেভাবে অ্যাবস্ট্রাক্টস পারে না তা সমর্থন করে support
ইন্টারফেসগুলি বিমূর্ত শ্রেণীর চেয়ে ভাল ভাড়া দেওয়ার একটি আকর্ষণীয় অবস্থান হ'ল যখন আপনাকে (সম্পর্কিত বা সম্পর্কযুক্ত) কোনও গ্রুপে অতিরিক্ত কার্যকারিতা যুক্ত করতে হবে। যদি আপনি তাদের একটি বেস বিমূর্ত শ্রেণি দিতে না পারেন (উদাঃ, তারা হ'ল sealed
বা ইতিমধ্যে তাদের পিতামাতা রয়েছে) তবে আপনি তাদের পরিবর্তে একটি ডামি (খালি) ইন্টারফেস দিতে পারেন এবং তারপরে কেবল সেই ইন্টারফেসের জন্য এক্সটেনশন পদ্ধতি লিখতে পারেন।
এটি করা খুব কঠিন কল হতে পারে ...
আমি যে পয়েন্টারটি দিতে পারি: একটি অবজেক্ট অনেকগুলি ইন্টারফেস বাস্তবায়িত করতে পারে, যখন কোনও বস্তু কেবল একটি বেস ক্লাসের উত্তরাধিকারী হতে পারে (সি # এর মতো আধুনিক ওও ভাষায় আমি জানি যে সি ++ এর একাধিক উত্তরাধিকার রয়েছে - তবে এটি কি ভ্রূণু নয়?)
একটি বিমূর্ত শ্রেণীর প্রয়োগ থাকতে পারে।
একটি ইন্টারফেসের বাস্তবায়ন নেই, এটি কেবল একধরণের চুক্তিটি সংজ্ঞায়িত করে।
কিছু ভাষা নির্ভর পার্থক্যও থাকতে পারে: উদাহরণস্বরূপ সি # এর একাধিক উত্তরাধিকার নেই, তবে এক শ্রেণিতে একাধিক ইন্টারফেস প্রয়োগ করা যেতে পারে।
বেসিক থাম্ব রুল: হ'ল "বিশেষ্যগুলি" অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন এবং "ক্রিয়াপদ" ইন্টারফেস ব্যবহার করুন
উদাহরণস্বরূপ: car
একটি বিমূর্ত শ্রেণি এবং drive
, আমরা এটি একটি ইন্টারফেস করতে পারি।
drive
গাড়ীর কার্যকারিতাও রাখতে পারি - এটি একটি বিমূর্ত শ্রেণি।