একটি ইন্টারফেস সুস্পষ্টভাবে বা স্পষ্টভাবে প্রয়োগের মধ্যে পার্থক্য কী?


64

ভিজ্যুয়াল স্টুডিওতে আমি একটি ইন্টারফেসে ডান ক্লিক করতে পারি এবং ইন্টারফেস প্রয়োগ করতে বা স্পষ্টভাবে ইন্টারফেস প্রয়োগ করতে পছন্দ করতে পারি।

ভিজ্যুয়াল স্টুডিওর স্ক্রিনশট

public class Test : ITest
{
    public string Id // Generated by Implement Interface
    {
        get { throw new NotImplementedException(); }
    }

    string ITest.Id // Generated by Implement Interface Explicitly
    {
        get { throw new NotImplementedException(); }
    }
}

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

আমি কোডটি কিছুটা আরও পঠনযোগ্য করে দেখছি যেহেতু আমি দেখতে পাচ্ছি যে পদ্ধতিটি / সম্পত্তিটি কোথা থেকে এসেছে তবে ক্লাসটি কীভাবে ব্যবহৃত হয় বা সংকলিত হয় তাতে কী কোনও পার্থক্য রয়েছে? আমি স্পষ্টভাবে বা স্পষ্টতই আমার ইন্টারফেসগুলি প্রয়োগ করি কিনা তা কি সত্যিই গুরুত্বপূর্ণ?

উত্তর:


51

পরীক্ষা করে দেখুন অ্যান্ড্রু ব্যারেট থেকে শীর্ষ উত্তর জন্য তাই "বনাম স্পষ্ট ইন্টারফেস বাস্তবায়ন অন্তর্নিহিত"

মূলত:

  • অন্তর্ভুক্ত: আপনি ইন্টারফেসের পদ্ধতি এবং বৈশিষ্ট্যগুলি অ্যাক্সেস করুন যেন তারা শ্রেণীর অংশ।
  • সুস্পষ্ট: ক্লাসটিকে বাস্তবায়িত ইন্টারফেস হিসাবে বিবেচনা করার সময় আপনি কেবল পদ্ধতি এবং বৈশিষ্ট্য অ্যাক্সেস করতে পারবেন।

কোড উদাহরণ:

অন্তর্নিহিত:

Test t = new Test();
t.Id; // OK
((ITest)t).Id; // OK

স্পষ্ট:

Test t = new Test();
t.Id; // Not OK
((ITest)t).Id; // OK

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


1
আমি অনিরাপদ ক্রিয়াকলাপগুলির সাথে এক ধরণের "লুকানো" ইন্টারফেস রাখতে সুস্পষ্ট বাস্তবায়নকে দরকারীও বলেছি। এটি সেই পদ্ধতিগুলিতে কলগুলি আরও আলাদা করে তোলে যা অনিরাপদ জিনিসগুলির জন্য ভাল।
ট্যামস সেজেলি

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

3
@ রাচেল: আমি যতদূর জানি যে পারফরম্যান্স ব্যয় শুধুমাত্র মূল্য ধরণের ক্ষেত্রে প্রযোজ্য।
গ্রোক

8

আপনি কীভাবে পদ্ধতিটি কল করেন তার মধ্যেও পার্থক্য রয়েছে।

একটি ব্যবহার করার সময় স্পষ্ট ইন্টারফেস বাস্তবায়ন, আপনি নির্দিষ্ট বাস্তবায়ন ডাকতে ইন্টারফেস টাইপ ব্যবহার করা আবশ্যক।

সুতরাং, কলিং কোডে ITestঅ্যাক্সেসের জন্য আপনাকে বিভিন্ন ধরণের পরিবর্তনশীল ব্যবহার করতে হবে ITest.Id

এমএসডিএন-তে প্রচ্ছদ ইন্টারফেস বাস্তবায়ন (সি # প্রোগ্রামিং গাইড) নিবন্ধটির একটি ভাল উদাহরণ রয়েছে।


4

এটি আপনাকে দুটি ইন্টারফেস প্রয়োগ করার অনুমতি দেয় যা একই পদ্ধতিটিকে সংজ্ঞায়িত করে। তবে, আপনি যদি স্পষ্টভাবে ইন্টারফেসটি প্রয়োগ করেন তবে চলকগুলি licit স্পষ্টত ইন্টারফেসে টাইপ করা হলে কেবল পদ্ধতিগুলি অ্যাক্সেস করা যায়।

দেখুন: সুস্পষ্ট ইন্টারফেস বাস্তবায়ন টিউটোরিয়াল


4

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

public interface ITest
{
    string Id { get; }
}

public interface IAlsoTest
{
    string Id { get; }
}

public interface ITestToo
{
    int Id { get; }
}

public class Test : ITest, IAlsoTest
{
    // Valid implicit implementation of BOTH interfaces
    public string Id
    {
        get { throw new NotImplementedException(); }
    }
}

public class TestSeparately : ITest, ITestToo
{
    // This way we can do different things depending
    // on which interface the callee called from.
    string ITest.Id
    {
        get { throw new NotImplementedException(); }
    }

    int ITestToo.Id
    {
        get { throw new NotImplementedException(); }
    }
}

public class TestOuch
{
    public void DoStuff()
    {
        var ts = new TestSeparately();

        // Works
        Console.WriteLine(((ITest)ts).Id);

        // Works
        Console.WriteLine(((ITestToo)ts).Id);

        // Not valid! Which one did we want to call?
        Console.WriteLine(ts.Id);
    }
}

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


3

জালায়ানের উত্তরের ভিত্তিতে,

  • অন্তর্ভুক্ত: আপনি ইন্টারফেসের পদ্ধতি এবং বৈশিষ্ট্যগুলি অ্যাক্সেস করুন যেন তারা শ্রেণীর অংশ।
  • সুস্পষ্ট: ক্লাসটিকে বাস্তবায়িত ইন্টারফেস হিসাবে বিবেচনা করার সময় আপনি কেবল পদ্ধতি এবং বৈশিষ্ট্য অ্যাক্সেস করতে পারবেন।

এখানে চিত্র বর্ণনা লিখুন

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