সি #: অ্যাবস্ট্রাক্ট ক্লাসগুলির ইন্টারফেস প্রয়োগ করতে হবে?


131

সি # তে আমার পরীক্ষার কোড:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

নিম্নলিখিত সংকলক ত্রুটির ফলাফল:

error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'

যেহেতু ক্লাসটি Testএকটি বিমূর্ত শ্রেণি , তাই সংকলকটির ইন্টারফেসটি প্রয়োগের জন্য এটির কেন প্রয়োজন? এই প্রয়োজনীয়তাটি কেবলমাত্র কংক্রিট শ্রেণীর জন্য বাধ্যতামূলক হওয়া উচিত নয় ?


হা হা। আমি একটি জিনিস লিখেছিলাম তারপর এটি পরিবর্তন করার সিদ্ধান্ত নিয়েছে। দুঃখিত। :)
জোয়েল

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

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

আমার আগের মন্তব্যটি উপেক্ষা করুন - এটি প্রত্যাশার মতো কার্যকর হয়নি, কমপক্ষে অবাক করার নীতিটি এখানে প্রয়োগ হয় না।
পল ম্যাকার্থি

উত্তর:


141

সি # তে, একটি শ্রেণি যা ইন্টারফেস প্রয়োগ করে প্রয়োজনীয় যে ইন্টারফেস সকল সদস্যদের সংজ্ঞায়িত করতে। একটি বিমূর্ত শ্রেণীর ক্ষেত্রে, আপনি abstractকীওয়ার্ড সহ কেবলমাত্র সেই সদস্যদের সংজ্ঞা দিন :

interface IFoo
{
    void Bar();
}

abstract class Foo : IFoo
{
    public abstract void Bar();
}

বা এটি অন্যভাবে বলতে: আপনি না আছে "বাস্তবায়ন" এটা (যা বিমূর্ত শ্রেণীর উপর একটি ভয়ানক সীমাবদ্ধতা হবে); যাইহোক, সি # তে, আপনাকে সংকলকটি বলতে হবে যে আপনি ইচ্ছাকৃতভাবে কংক্রিট সাবক্লাসগুলিতে বক দিচ্ছেন - এবং উপরের কোডের লাইনটি কীভাবে এটি করতে হবে তা দেখায়।

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


2
@ বেন আপনার মন্তব্যটি সবেমাত্র দেখেছেন। আপনি সম্ভবত এটি ইতিমধ্যে খুঁজে পেয়েছেন, তবে যদি অন্য কারওর প্রয়োজন হয়। সুস্পষ্ট ইন্টারফেস বাস্তবায়নগুলি দেখুন: msdn.microsoft.com/en-us/library/ms173157.aspx
জোয়েল

2
@ জোয়েল @ বেন আমি স্পষ্টভাবে ইন্টারফেসগুলি বিমূর্ত শ্রেণীর সাথে কাজ করতে পারে বলে মনে করি না। উপরোক্ত উদাহরণে কোড সালে সংজ্ঞা পরিবর্তন Fooকরার জন্য public abstract void IFoo.Bar();এবং আপনার অভিযোগ "পাবলিক" এবং "বিমূর্ত" বৈধ সংশোধনকারীদের নয় পেতে।
ড্যারেন কুক

8
এটি কেন একেবারেই প্রয়োজনীয় তা এই প্রশ্নের উত্তর দেয় না, এটি একটি বিমূর্ত শ্রেণি বিবেচনা করে এবং সংকলকটি কীভাবে ফাঁকা পূরণ করবেন তা জেনে রাখা উচিত। জাভাতে এটি প্রয়োজনীয় নয়, যা আইওসি পাত্রে যেমন ডেকোরেটর প্যাটার্নের জন্য বিভিন্ন দরকারী নিদর্শনগুলির জন্য অনুমতি দেয় যেমন স্প্রিং / জাভাএই (যখন আপনাকে কোনও পরিচালিত ইন্টারফেসের কোনও নির্দিষ্ট পদ্ধতি সাজাতে হবে)। একই বাস্তবায়ন in.net খুব বাগাড়ম্বরপূর্ণ বিশেষত যেমন nhibernate এর ISession হিসাবে বড় ইন্টারফেসগুলি করা ডেভেলপারদের বাধ্য করতে হবে
Sheepy

1
AspectJ এর মিশ্রিনগুলি এর অন্য উদাহরণ another এটি আপনাকে অনেক বিমূর্ত শ্রেণি থেকে একক ইন্টারফেসে আংশিক বাস্তবায়ন মিশ্রিত করতে দেয়। প্রতিটি বিমূর্ত শ্রেণিকে কেবল যে পদ্ধতিটি প্রয়োগ করতে চায় তা প্রয়োগ করতে হবে। আমি
শেপি

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

10

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

https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx


1
সুপার স্পষ্ট উত্তর এবং দুর্দান্ত যে আপনি উভয় পরিস্থিতি সরবরাহ করেছেন, যেমন আপনি কখনও কখনও বেস ক্লাসে আচরণটি বাস্তবায়ন করতেও পারেন
VinKel

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

5

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

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