সি # তে এক্সটেনশন পদ্ধতিগুলির সাথে ইন্টারফেসের পরিবর্তে অ্যাবস্ট্রাক্ট ক্লাসগুলি কখন ব্যবহার করবেন?


70

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

ইন্টারফেস + এক্সটেনশন পদ্ধতি মডেলের একটি উল্লেখযোগ্য উদাহরণ হল লিনকিউ, যেখানে কোনও ধরণের IEnumerableএক্সটেনশন পদ্ধতির মাধ্যমে প্রয়োগকারী যে কোনও ধরণের জন্য ক্যোয়ারী কার্যকারিতা সরবরাহ করা হয় ।


2
এবং আমরা ইন্টারফেসেও 'সম্পত্তি' ব্যবহার করতে পারি।
গুলশান

1
একটি সাধারণ ওওডি প্রশ্নের পরিবর্তে একটি সি # নির্দিষ্ট বলে মনে হচ্ছে। (বেশিরভাগ অন্যান্য ওও ভাষায় এক্সটেনশন পদ্ধতি বা বৈশিষ্ট্য নেই))
পিটার তারেক


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

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

উত্তর:


63

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

public abstract class SomethingDoer
{
    public void Do()
    {
        this.DoThis();
        this.DoThat();
    }

    protected abstract void DoThis();
    protected abstract void DoThat();
}

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

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

সম্পাদন করা

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

ব্যক্তিগতভাবে, বর্তমানে একটি সাধারণ প্রচলিত অভ্যাসটি পরিবর্তনের সুবিধা দেখে আমার সমস্যা হচ্ছে, তবে এটি করার ক্ষেত্রে খুব কম লোকেরাই দেখতে পাচ্ছেন।

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


আমাকে এটি
মারধর করুন

1
তবে একই জিনিস ইন্টারফেস এবং এক্সটেনশন পদ্ধতিতে করা যেতে পারে। বিমূর্ত বেস শ্রেণিতে আপনি যে পদ্ধতিগুলি সংজ্ঞায়িত করছেন সেগুলি Do()একটি এক্সটেনশন পদ্ধতি হিসাবে সংজ্ঞায়িত করা হবে। এবং উত্সর্গীকৃত ক্লাসগুলির সংজ্ঞার মতো পদ্ধতিগুলি DoThis()মূল ইন্টারফেসের সদস্য হবে। এবং ইন্টারফেসের সাহায্যে আপনি একাধিক বাস্তবায়ন / উত্তরাধিকার সমর্থন করতে পারেন। এবং এটি দেখুন- odetocode.com/blogs/scott/archive/2009/10/05/…
গুলশান

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

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

-1 কারণ আপনি কোনও উপায়েই প্রদর্শন করেন নি যেভাবে ইন্টারফেসের চেয়ে অ্যাবস্ট্রাক্ট ক্লাসগুলি টেম্পলেট পদ্ধতির চেয়ে ভাল ফিট
বেনজামিন হডসন

25

এটা সব সম্পর্কে কি আপনার মডেলকে করতে চাই:

বিমূর্ত শ্রেণি উত্তরাধিকার অনুসারে কাজ করে । কেবলমাত্র বিশেষ বেস শ্রেণি হওয়ায় তারা কিছু -সম্পর্কিত- মডেল ।

উদাহরণস্বরূপ, একটি কুকুর হয় একটি প্রাণী, এইভাবে আমরা আছে

class Dog : Animal { ... }

যেহেতু আসলে একটি জেনেরিক অল-অ্যানিমাল (এটি দেখতে কেমন হবে?) তৈরি করার কোনও অর্থ নেই , তাই আমরা এই Animalবেস ক্লাসটি তৈরি করি abstract- তবে এটি এখনও একটি বেস ক্লাস। এবং Dogক্লাসটি একটি হওয়া ছাড়া অর্থবোধ করে না Animal

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

যেমন ধরুন IComparable- এমন একটি বস্তু যা অন্য একটির সাথে তুলনা করা সমর্থন করে

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

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


আপনি কখন বেস ক্লাস বিমূর্ত রাখতে পছন্দ করবেন?
গুলশান

1
@ গুলশান: যদি এটি হয় - কোনও কারণে - আসলে বেস বর্গের কোনও উদাহরণ তৈরি করার কোনও মানে নেই। আপনি একটি চিহুয়া বা একটি সাদা হাঙ্গর "তৈরি" করতে পারেন, তবে আপনি আরও বিশেষজ্ঞীকরণ ব্যতীত কোনও প্রাণী তৈরি করতে পারবেন না - সুতরাং আপনি Animalবিমূর্ততা তৈরি করবেন। এটি আপনাকে abstractউত্পন্ন ক্লাসগুলির দ্বারা বিশেষায়িত করার জন্য ফাংশনগুলি লিখতে সক্ষম করে । বা তার বেশি প্রোগ্রামিং পদ - এটি সম্ভবত একটি তৈরি করতে কোন অর্থে করতে না UserControl, কিন্তু হিসাবে একটি Button হল একটি UserControl, তাই আমরা বর্গ / baseclass সম্পর্ক একই ধরনের আছে।
দারিও

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

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

3

আমি ঠিক বুঝতে পেরেছি যে আমি কয়েক বছরে বিমূর্ত ক্লাস ব্যবহার করি নি (কমপক্ষে তৈরি হয়নি)।

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

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

আমি ইন্টারফেসের জন্য যেতে হবে।


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

ঝনঝন সংবেদন সম্পর্কে একই। ক্লাসগুলি, সি # এবং জাভার প্রথম এবং সর্বাগ্রে বৈশিষ্ট্য, একটি প্রকার তৈরি করার জন্য এবং অবিলম্বে এটি একটি বাস্তবায়নে চিরকালের জন্য শৃঙ্খলাবদ্ধ করার বৈশিষ্ট্য।
জেসি মিলিকান

2

আইএমএইচও, আমি মনে করি যে এখানে ধারণার মিশ্রণ রয়েছে।

শ্রেণিগুলি একটি নির্দিষ্ট ধরণের উত্তরাধিকার ব্যবহার করে, যখন ইন্টারফেসগুলি ভিন্ন ধরণের উত্তরাধিকার ব্যবহার করে।

উভয় ধরণের উত্তরাধিকার গুরুত্বপূর্ণ এবং দরকারী, এবং প্রত্যেকেরই এর উপকারিতা এবং বিপরীতে রয়েছে।

শুরুতে শুরু করা যাক।

ইন্টারফেসের সাথে গল্পটি সি ++ এর সাথে দীর্ঘ সময় শুরু হয়। ১৯৮০ এর দশকের মাঝামাঝি, যখন সি ++ বিকাশ করা হয়েছিল, তখন অন্য ধরণের ধরণের হিসাবে ইন্টারফেসের ধারণাটি এখনও উপলব্ধি করা যায় নি (এটি সময়ে আসবে)।

সি ++ এর কেবল এক ধরণের উত্তরাধিকার ছিল, শ্রেণীর দ্বারা ব্যবহৃত ধরণের উত্তরাধিকার, যা বাস্তবায়ন উত্তরাধিকার বলে।

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

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

সুতরাং, সি # তে ইন্টারফেসের পিছনে আর্কিটেকচারাল কারণগুলি হ'ল জিওএফ সুপারিশ।

আমি আশা করি এটি সহায়ক হতে পারে।

শুভেচ্ছা, Gastón


1

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

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

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


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

@ এড জেমস আমার মনে হয় "কম শক্তিশালী" = "আরও নমনীয়" আপনি কখন আরও নমনীয় ইন্টারফেসের পরিবর্তে আরও শক্তিশালী বিমূর্ত শ্রেণি বেছে নেবেন?
গুলশান

@ এড জেমস এএসপ.এমভিসি-তে এক্সটেনশন পদ্ধতি প্রথম থেকেই ব্যবহৃত হয়েছিল। তুমি এটা সম্পর্কে কী ভাব?
গুলশান

0

আমি মনে করি যে সি # তে একাধিক উত্তরাধিকার সমর্থিত নয় এবং সে কারণেই সি # তে ইন্টারফেসের ধারণাটি চালু করা হয়েছে।

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


সুনির্দিষ্টভাবে বলতে গেলে, এটি খাঁটি বিমূর্ত ক্লাস যা C # তে "ইন্টারফেস" নামে পরিচিত।
জোহান বুলি

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