ইন্টারফেসগুলি অন্য ইন্টারফেসগুলির প্রসারিত (এবং এর উত্তরাধিকারী পদ্ধতিগুলি করার ক্ষেত্রে) প্রসারণ করা উচিত


13

যদিও এটি একটি সাধারণ প্রশ্ন তবে এটি বর্তমানে যে সমস্যার মুখোমুখি হচ্ছি তাও এটি নির্দিষ্ট। আমার কাছে বর্তমানে আমার সমাধানে একটি ইন্টারফেস নির্দিষ্ট করা আছে called

public interface IContextProvider
{
   IDataContext { get; set; }
   IAreaContext { get; set; }
}

এই ইন্টারফেসটি প্রায়শই পুরো প্রোগ্রাম জুড়ে ব্যবহৃত হয় এবং তাই আমার প্রয়োজনীয় জিনিসগুলিতে আমার কাছে সহজে অ্যাক্সেস রয়েছে। তবে আমার প্রোগ্রামের একটি অংশের মোটামুটি নিম্ন স্তরে আমার অন্য ক্লাসে অ্যাক্সেস দরকার যা IAreaContext ব্যবহার করবে এবং এটি বন্ধ করে কিছু অপারেশন করবে। সুতরাং এই সৃষ্টিটি করার জন্য আমি আর একটি ফ্যাক্টরি ইন্টারফেস তৈরি করেছি:

public interface IEventContextFactory 
{
   IEventContext CreateEventContext(int eventId);
}

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

// example of problem
public class MyClass
{
    public MyClass(IContextProvider context, IEventContextFactory event)
    {
       _context = context;
       _event = event;
    }

    public void DoSomething() 
    {
       // the only place _event is used in the class is to pass it through
       var myClass = new MyChildClass(_event);
       myClass.PerformCalculation();      
    }
}

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

public interface IContextProvider : IEventContextFactory

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


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

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

ইন্টারফেসগুলি পিতামাতাদের প্রসারিত করতে পারে, তবে এটি কেন খারাপ অভ্যাস হবে? যদি একটি ইন্টারফেস বৈধভাবে অন্য ইন্টারফেসের একটি সুপার সেট অবশ্যই অবশ্যই এটির প্রসারিত করা উচিত।
রবিন উইনস্লো

উত্তর:


10

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

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


6

হ্যাঁ, তবে তা যদি বোঝা যায় তবেই। নিজেকে নীচের প্রশ্নগুলি জিজ্ঞাসা করুন এবং যদি এক বা একাধিক প্রয়োগ হয় তবে অন্যের থেকে ইন্টারফেস উত্তরাধিকার সূত্রে গ্রহণযোগ্য।

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

আপনার উদাহরণে, আমি মনে করি না যে এটির কোনওটির উত্তর হ্যাঁ। আপনি এটি অন্য সম্পত্তি হিসাবে যুক্ত করা ভাল হতে পারে:

public interface IContextProvider
{
   IDataContext DataContext { get; set; }
   IAreaContext AreaContext { get; set; }
   IEventContextFactory EventContextFactory { get; set; }
}

ইন্টারফেসটি প্রসারিত করার চেয়ে কীভাবে এটিকে সম্পত্তি বানানো আরও ভাল হতে পারে, বা কথা বলার জন্য এটি বিড়ালের চামড়ার অন্য উপায় কি?
dreza

1
পার্থক্যটি হ'ল যদি আপনি IContextProviderপ্রসারিত করেন IEventContextFactory, তবে ContextProviderবাস্তবায়নের জন্য সেই পদ্ধতিটিও কার্যকর করা দরকার। আপনি যদি এটি সম্পত্তি হিসাবে যুক্ত করেন তবে আপনি বলছেন যে এর একটি ContextProviderরয়েছে IEventContextFactoryতবে বাস্তবিকতার বিশদটি আসলে জানে না।
ট্রেভর পিলি

4

হ্যাঁ, অন্যটি থেকে একটি ইন্টারফেস প্রসারিত করা ভাল।

কোনও নির্দিষ্ট ক্ষেত্রে এটি সঠিক জিনিস করা উচিত কিনা এই প্রশ্ন দুজনের মধ্যে সত্য "এই-এ" আছে কিনা তার উপর নির্ভর করে।

বৈধ "is-a" সম্পর্কের জন্য কী প্রয়োজন?

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

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

যদি উভয়ই সত্য হয় তবে উত্তরাধিকার হ'ল দুটি ইন্টারফেসের জন্য সঠিক সম্পর্ক।


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

1

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

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


তার জন্য ধন্যবাদ. দায়িত্বের চেয়ে বৈশিষ্ট্যের মতো আচরণ করার অর্থ কী?
dreza

@ ড্রেজা আমার অর্থ এসআইপি হিসাবে সোলিডের মতো দায়িত্ব এবং স্কালাল বৈশিষ্ট্যের মতো বৈশিষ্ট্য। ইন্টারফেসটি আপনার সমস্যাটিকে কীভাবে মডেল করে তা বেশিরভাগ ধারণা । এটি সমস্যার কোনও প্রাথমিক অংশ বা অন্যথায় পৃথক পৃথক প্রকারের একটি সাধারণ অংশে একটি দর্শনকে উপস্থাপন করে?
টেলাস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.