সি # তে, কোনও শ্রেণি অন্য শ্রেণি এবং একটি ইন্টারফেস থেকে উত্তরাধিকারী হতে পারে?


130

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

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

class GenericDevice
{
   private string _connectionState;
   public connectionState
   {
      get{return _connectionState; }
      set{ _connectionState = value;}
   }
}

interface IOurDevices
{
   void connectToDevice();
   void DisconnectDevice();
   void GetFirmwareVersion();
}

class USBDevice : IOurDevices : GenericDevice
{
   //here I would define the methods in the interface
   //like this...
   void connectToDevice()
   {
       connectionState = "connected";
   }
}

//so that in my main program I can do this...

class myProgram
{
   main()
   {
      USBDevice myUSB = new USBDevice();
      myUSB.ConnectToDevice;
   }
}

5
আপনার ভবিষ্যতের রেফারেন্সের জন্য, সি # স্পেসিফিকেশনের 10.1.4 বিভাগে একাধিক বেস প্রকারের শ্রেণিটি কীভাবে ঘোষণা করতে হবে তা সুনির্দিষ্টভাবে বর্ণনা করে।
এরিক লিপার্ট

@ এরিক লিপার্ট: আপনি কি দয়া করে আমাকে এই মামলাটি সম্পর্কে বুঝতে সাহায্য করতে পারেন যে এটি সঠিক উপায় এবং ভবিষ্যতে পাওয়া যাবে কিনা?
গুল মোঃ এরশাদ

উত্তর:


246

হ্যাঁ. চেষ্টা করুন:

class USBDevice : GenericDevice, IOurDevice

দ্রষ্টব্য: ইন্টারফেসের নামের তালিকার আগে বেস ক্লাসটি আসা উচিত।

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


1
হ্যাঁ এই কাজ! কেন আমি তা ভেবে দেখিনি! এবং নীচে মন্তব্য। আমাকে ক্লিয়ার করার জন্য আপনাকে ধন্যবাদ (ক্লাসগুলি ইন্টারফেসের উত্তরাধিকারী হয় না, কার্যকর ইন্টারফেসগুলি)
পিকইউরব্রেইন

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

1
কিছুটা প্রসারিত করতে: যদি আপনার বেস ক্লাসটি ইন্টারফেস প্রয়োগ করে তবে আপনার উত্পন্ন শ্রেণি স্বয়ংক্রিয়ভাবে সেই ইন্টারফেসটি প্রয়োগ করে - এমনকি ছাড়াই USBDevice : IOurDevice। স্পষ্টভাবে বাস্তবায়ন যুক্ত করা বেস বর্গটিকে প্রভাবিত করে না, তবে এটি ইন্টারফেসের উপর জোর রাখতে সহায়তা করতে পারে।
STW

1
@ ডেভিড, আপনি যখন ভুল নন, এমন কোনও পরিভাষা যা @ জর্ডানের কোডকে কাজ করা থেকে বিরত রাখছিল না। এটি ভুল বাক্য গঠন ছিল।
জেএমডি

2
+1 বেস এবং ইন্টারফেস উভয় ক্ষেত্রে অভিন্ন সদস্যদের সম্পর্কে জিজ্ঞাসা করতে চাইলে একটি প্রশ্ন পরিষ্কার করার জন্য।
রিগার্ড্ট স্টেইন

21

না, ঠিক না তবে এটি কোনও শ্রেণী থেকে উত্তরাধিকারী হতে পারে এবং এক বা একাধিক ইন্টারফেস প্রয়োগ করতে পারে।

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


8
বা এরিক লিপার্ট, যার লেখাটি খুব নির্ভুল।
ম্যাথিয়াস

21

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

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


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

public interface ITwo : IOne

প্রযুক্তিগত উত্তরটি হ'ল কয়েকটি কারণে ITwoউত্তরাধিকারী IOne:

  • ইন্টারফেস কখনো একটি বাস্তবায়ন নেই, তাই তর্ক যে ITwo কার্যকরী IOne ফ্ল্যাট ভুল
  • ITwoউত্তরাধিকার সূত্রে IOneপদ্ধতিগুলি MethodOne()বিদ্যমান থাকলে IOneতা থেকেও এটি অ্যাক্সেসযোগ্য ITwo। যেমন: ((ITwo)someObject).MethodOne())বৈধ, যদিও এর ITwoজন্য স্পষ্টভাবে কোনও সংজ্ঞা নেইMethodOne()
  • ... কারণ রানটাইম তাই বলে! typeof(IOne).IsAssignableFrom(typeof(ITwo))আয়true

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


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

@ এরিক আমি সম্মত হলাম এটি একটি অস্পষ্ট শব্দ এবং কিছুক্ষণ আগে সহকর্মীর সাথে এটি নিয়ে বিতর্ক হয়েছিল। শেষ পর্যন্ত আমরা সিদ্ধান্ত নিয়েছি যে "ITW IOne এর উত্তরাধিকারী"। আমি আমার উত্তরটি কয়েকটি ছোট কারণের সাথে আপডেট করব (কেবলমাত্র তারা কোনও মন্তব্যে পরিষ্কারভাবে ফিট করে না)।
STW

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

আমার পছন্দ হওয়া আরেকটি শব্দটি হ'ল "প্রসারিত"। সুতরাং আপনি "ইন্টারফেস IFoo: IBar" পড়তে পারার অর্থ এই হতে পারে যে IFoo IBar এর প্রয়োজনীয়তা প্রসারিত করে।
জেসন

1
@ জোয়ান: আপনি সঠিক যে ক্লাসগুলি ইন্টারফেস প্রয়োগ করে (এবং উত্তরাধিকারী হতে পারে না)। এরিকের বক্তব্যটি হ'ল ইন্টারফেসগুলি অন্য ইন্টারফেসের উত্তরাধিকারী হতে পারে - যা হজম করা কিছুটা কঠিন হতে পারে যে ইন্টারফেসগুলি বাস্তবায়নের পরিবর্তে কেবল "স্পেসিফিকেশন"।
এসটিডাব্লু

1

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


এটি সব ক্ষেত্রেই সর্বজনীন হতে হবে না। কেবল অ্যাক্সেসযোগ্য। উদাহরণস্বরূপ class ContainsAll { private interface INested { /* ... */ } private class MyExample : INested { /* ... */ } }, MyExampleক্লাস একটি নেস্টেড ব্যক্তিগত ইন্টারফেস প্রয়োগ করে। অন্যান্য উদাহরণগুলিতে, নেস্টেড ইন্টারফেস (এবং ধারণাগত ক্লাস) হতে পারে internal। এগুলি নির্ভর করে যে তাদের কে ব্যবহার করতে হবে এবং তাদেরকে বিরক্ত করা দরকার।
জেপ্প স্টিগ নীলসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.