আমি কীভাবে কোনও ইন্টারফেসে স্থির পদ্ধতিগুলি প্রয়োগ করতে পারি?


92

আমার কাছে একটি তৃতীয় পক্ষের সি ++ ডিএলএল রয়েছে যা আমি সি # থেকে কল করি।

পদ্ধতিগুলি অচল।

কিছু ইউনিট টেস্টিংয়ের জন্য আমি এটি বিমূর্ত করতে চাই তাই আমি এতে স্থিতিশীল পদ্ধতিগুলির সাথে একটি ইন্টারফেস তৈরি করেছি তবে এখন আমার প্রোগ্রামের ত্রুটিগুলি:

এই আইটেমটির জন্য সংশোধক 'স্ট্যাটিক' বৈধ নয়

MyMethod cannot be accessed with an instance reference; qualify it with a type name instead

আমি কীভাবে এই বিমূর্ততা অর্জন করতে পারি?

আমার কোডটি দেখতে এমন দেখাচ্ছে

private IInterfaceWithStaticMethods MyInterface;

public MyClass(IInterfaceWithStaticMethods myInterface)
{
  this.MyInterface = myInterface;
}

public void MyMethod()
{
  MyInterface.StaticMethod();
}

4
: হয়তো আপনি এক্সটেনশানটি পদ্ধতি এটা করতে পারেন stackoverflow.com/questions/1243921/...
hcb

উত্তর:


47

আপনি সি # তে একটি ইন্টারফেসে স্থির সদস্যদের সংজ্ঞা দিতে পারবেন না। একটি ইন্টারফেস উদাহরণস্বরূপ একটি চুক্তি ।

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

একবার আপনি এই 2 টি ক্লাস সংজ্ঞায়িত হয়ে গেলে আপনি আপনার পরিবেশের জন্য প্রয়োজনীয় একটি তৈরি করতে পারেন এবং এটি MyClassনির্মাণকারীর হাতে দিতে পারেন।


64
-1 বলার জন্য An interface is a contract, not an implementation.- এটি সত্য, তবে সম্পূর্ণ অপ্রাসঙ্গিক ( অ সিকুইটচার ) এখানে, যেহেতু স্থির পদ্ধতি নিজেই বাস্তবায়নের অংশ নয় - বাস্তবায়ন, সংজ্ঞা অনুসারে, ডেটা উপর ভিত্তি করে , যা স্থির সদস্যদের জন্য অ্যাক্সেসযোগ্যAn interface type definition can define and implement static methods (see §8.4.3) since static methods are associated with the interface type itself rather than with any value of the type.- মনে রাখবেন যে staticসদস্যরা সাধারণত ইউটিলিটি পদ্ধতি

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

4
আমি আংশিকভাবে সম্মত হই যে An interface is a contract, not an implementationএটি অকেজো, কখনও কখনও কিছুটা প্রাসঙ্গিককরণ সত্যই সহায়তা করে। আর আমি সম্পূর্ণই সাথে একমত static method is not a part of implementation itself স্ট্যাটিক পদ্ধতি, আছে , একটি বাস্তবায়ন তারা বাস্তবায়ন অংশ হয়ে শুধুমাত্র যদি অন্য পদ্ধতি বাস্তবায়নে বাস্তবায়ন হিসাবে ব্যবহার। তবে আমার অভিধান যা শিখেছে তার উপর ভিত্তি করে, যতদূর আমি জানি, প্রোগ্রামিং ভাষার উপর নির্ভর করে পরিভাষাটিও পরিবর্তিত হয়। স্থিতিশীল পদ্ধতিগুলি ইন্টারফেস হতে পারে না কারণ যে কোনওভাবেই কেবল 1 টি প্রয়োগ করা যেতে পারে।
CoffeDeveloper

কল্পনা করুন যে আমার একটি IPersonচুক্তি রয়েছে যা জানিয়েছে যে GetCountryসেই ব্যক্তির আদি দেশের নাম দেবে ... FrenchPersonসত্তা সবাই "ফ্রান্স" GermanPersonবলবে এবং সবাই "জার্মানি" বলবে, যখন বিভিন্ন ধরণের সত্তা এমএসের মতো একই (ডেটা) সারণি ভাগ করে দেয় তখনও দরকারী আকাশী নীল এক, বলতে Connection, Postএবং Commentসঞ্চিত হয় Usersসেইজন্য গাছগুলির সত্ত্বা একটি ভাগ করা তথ্য আছে, AzureTable, IUsersথাকতে পারে GetTableNameস্ট্যাটিক পদ্ধতি ...
সার্জ

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

112

ইন্টারফেসে স্থির সদস্য থাকতে পারে না এবং স্ট্যাটিক পদ্ধতিগুলি ইন্টারফেস পদ্ধতির প্রয়োগ হিসাবে ব্যবহার করা যায় না।

আপনি যা করতে পারেন তা হল একটি স্পষ্ট ইন্টারফেস প্রয়োগকরণ:

public interface IMyInterface
{
    void MyMethod();
}

public class MyClass : IMyInterface
{
    static void MyMethod()
    {
    }

    void IMyInterface.MyMethod()
    {
        MyClass.MyMethod();
    }
}

বিকল্পভাবে, আপনি কেবল অ স্থির পদ্ধতি ব্যবহার করতে পারেন, এমনকি যদি তারা কোনও নির্দিষ্ট সদস্যদের অ্যাক্সেস না করে।


18
যে কেউ কেন এটি করতে চায় তা ভাবছেন, স্থিতিশীল পদ্ধতি প্রয়োগ করে এমন উত্তরাধিকার কোডের জন্য ইউনিট / ইন্টিগ্রেশন পরীক্ষা লেখার ক্ষেত্রে এটি বিশেষভাবে কার্যকর।
দেজ্জামান্ডো

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

19

স্ট্যাটিক সদস্যরা সিএলআর-এ পুরোপুরি আইনী, কেবল সি # নয়।

আপনি বাস্তবায়নের বিশদটি লিঙ্ক করতে IL তে কিছু আঠালো প্রয়োগ করতে পারেন।

নিশ্চিত না যে সি # সংকলক তাদের কল করার অনুমতি দিবে কিনা?

দেখুন: 8.9.4 ইন্টারফেস ধরণের সংজ্ঞা ECMA-335।

ইন্টারফেস ধরণের মানগুলির উপস্থাপনা সম্পর্কে তারা কিছু না বলে ইন্টারফেসের প্রকারগুলি অগত্যা অসম্পূর্ণ। এই কারণে, একটি ইন্টারফেস ধরণের সংজ্ঞা ইন্টারফেস ধরণের মানগুলির জন্য ক্ষেত্রের সংজ্ঞা প্রদান করে না (উদাহরণস্বরূপ ক্ষেত্রগুলি), যদিও এটি স্থির ক্ষেত্রগুলি ঘোষণা করতে পারে (দেখুন §8.4.3)।

একইভাবে, একটি ইন্টারফেস ধরণের সংজ্ঞা তার ধরণের মানগুলিতে কোনও পদ্ধতির জন্য বাস্তবায়ন সরবরাহ করে না। তবে একটি ইন্টারফেস ধরণের সংজ্ঞা। এবং সাধারণত does পদ্ধতি চুক্তিগুলি (পদ্ধতির নাম এবং পদ্ধতির স্বাক্ষর) সংজ্ঞায়িত করতে পারে যা সমর্থনকারী প্রকার দ্বারা প্রয়োগ করা হবে। একটি ইন্টারফেস ধরণের সংজ্ঞা স্ট্যাটিক পদ্ধতিগুলি নির্ধারণ করতে এবং প্রয়োগ করতে পারে (.8.4.3 দেখুন) যেহেতু স্থির পদ্ধতিগুলি কোনও ধরণের মানের পরিবর্তে ইন্টারফেস টাইপের সাথে সম্পর্কিত।


10
রেফারেন্সের জন্য, CLS Rule 19: CLS-compliant interfaces shall not define static methods, nor shall they define fields.এটি বলে যায় যে সিএলএসের অনুগত গ্রাহকদের পক্ষে এই ধরণের ইন্টারফেস প্রত্যাখ্যান করা ঠিক আছে। আমি প্রায় এক বছর আগে একটি ইন্টারফেসে একটি স্ট্যাটিক পদ্ধতি কল করার চেষ্টা করেছি এবং সি # সংকলক এটি সংকলন করবে না।
ক্রিস্টোফার কারেনস

ক্রিশ্ফার কারিক্রেনস সিএলএস সম্পর্কে আরও উল্লেখ করুন: Common Language Specification (CLS) is a set of basic language features that .Net Languages needed.... When there is a situation to communicate Objects written in different .Net Complaint languages , those objects must expose the features that are common to all the languages. এটি উপলব্ধি করে যে সিএলএস যদি বিভিন্ন .NET ভাষা জুড়ে ইন্টারঅ্যাপেরিবিলিটি সম্পর্কে থাকে, এবং সি # কোনও ইন্টারফেসে স্থির সদস্যদের অনুমতি না দেয়, তবে সিএলএস এগুলিকে গ্রন্থাগারগুলি নিশ্চিত করতে নিষেধ করবে অন্যান্য। নেট ভাষা সি # থেকে কল করা যেতে পারে।
সাইমন তেউসি

17

আপনি স্থির পদ্ধতিগুলি সি # 8 এ সংজ্ঞায়িত করতে পারেন তবে আপনাকে অবশ্যই এটির জন্য একটি ডিফল্ট বডি ঘোষণা করতে হবে।

    public interface IMyInterface
    {
          static string GetHello() =>  "Default Hello from interface" ;
          static void WriteWorld() => Console.WriteLine("Writing World from interface");
    }

অথবা আপনি যদি কোনও ডিফল্ট বডি রাখতে না চান তবে কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলুন:

    public interface IMyInterface
    {
          static string GetHello() =>  throw new NotImplementedException() ;
          static void WriteWorld() => throw new NotImplementedException();
    }

দেখে মনে হচ্ছে ইন্টারফেসের স্থির সদস্যরা বেশ বেহুদা কারণ আপনি ইন্টারফেসের উদাহরণ দিয়ে এগুলি অ্যাক্সেস করতে পারবেন না। কমপক্ষে সি # 8 এ
পাভেল সাপেইহিন

4
ইন্টারফেস বাস্তবায়ন দৃষ্টিকোণ হিসাবে আপনার অধিকার। এটা অকেজো। তবে এই ইন্টারফেসটি ব্যবহার করে এমন প্রতিটি শ্রেণিতে আপনার অন্ততপক্ষে কোনও প্রয়োগকৃত পদ্ধতি রয়েছে বলে আপনি নিশ্চিত। (এটি ইন্টারফেসগুলির জন্য এক ধরণের
alচ্ছিক

5

আপনি এটি প্রতিবিম্ব সঙ্গে প্রার্থনা করতে পারে:

MyInterface.GetType().InvokeMember("StaticMethod", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);

4
এবং যদি আপনার মাইন্টারফেসের উদাহরণ না থাকে তবে আপনি "মাইআইন্টারফেস.গেটটাইপ ()" এর পরিবর্তে "টাইপফ (মাইইন্টারফেস)" ব্যবহার করতে পারেন।
রেনিপেট

সেই সময়টি একটি ভাল ধারণার মতো মনে হয়েছিল এবং আমি এটি প্রতিবিম্বের মাধ্যমে চালিয়ে যেতে পারি তবে একটি সামান্য সতর্কতা: প্রোগ্রামটি যদি এই জাতীয় পদ্ধতিটির নাম পরিবর্তন করে দেয় তবে এটি আরও সমস্যাযুক্ত হয়ে ওঠে।
রেনিপেট

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

প্রতিবিম্ব এই ক্ষেত্রে খুব চরম
স্টেপান ইভানেনকো

3

সি # "টেন" ভূমিকাগুলির পাশাপাশি ইন্টারফেসে স্থির সদস্যদের অনুমতি দিতে চলেছে । এটি একটি বিশাল পদক্ষেপ, এটি প্রতিফলনের কোনও ব্যবহার ছাড়াই জেনেরিক অপারেটরটিকে ওভারলোডিংও মঞ্জুরি দেয়। ক্লাসিক মনোয়েড উদাহরণটি ব্যবহার করে এটি কীভাবে কাজ করে তা এখানে একটি উদাহরণ স্নিপেট রয়েছে, যা "কিছু যোগ করা যায়" বলার জন্য কেবল জঞ্জাল। থেকে সরাসরি গৃহীত ভবিষ্যতে মধ্যে সি #: Mads Torgersen :

interface IMonoid<T>
{
    static T Zero { get; }
    static T operator +(T t1, T t2);
}

public static T AddAll<T>(T[] ts) where T : IMonoid<T>
{
    T result = T.Zero;
    foreach (T t in ts) { result += t; }
    return result;
}

role IntAddMonoid extends int : IMonoid<int>
{
    public static int Zero => 0;
}

IntAddMonoid[] values = new int[] {1, 2, 4, 8, 16, 32};
int sixtyThree = AddAll<IntAddMonoid>(values); // == 63

অতিরিক্ত সম্পদ:

জেরেমি বাইটস: সি # 8 ইন্টারফেসের স্থির সদস্য

সম্পাদনা

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


1

কেন আপনার ইন্টারফেসে স্থির পদ্ধতি থাকতে পারে না: কেন সি # কোনও ইন্টারফেস প্রয়োগের জন্য স্ট্যাটিক পদ্ধতিগুলিকে অনুমতি দেয় না?

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

অর্থাত্

public static class MyStaticClass
{
    public static void MyStaticMethod()
    {...}
}

public interface IStaticWrapper
{
    void MyMethod();
}

public class MyClass : IStaticWrapper
{
    public void MyMethod()
    {
        MyStaticClass.MyStaticMethod();
    }
}

স্ট্যাটিক ক্লাসের সাথে ইন্টারফেসটি কেবলমাত্র ইন্টারফেস ব্যবহারের সুবিধা কী?
সেলেন

1

সি # 8 ইন্টারফেসে স্থির সদস্যদের অনুমতি দেয়

সি # 8.0 দিয়ে শুরু করে একটি ইন্টারফেস সদস্যদের জন্য একটি ডিফল্ট বাস্তবায়ন সংজ্ঞায়িত করতে পারে। এটি সাধারণ কার্যকারিতার জন্য একটি একক বাস্তবায়ন প্রদানের জন্য স্থিতিশীল সদস্যদেরও সংজ্ঞায়িত করতে পারে।

ইন্টারফেস (সি # রেফারেন্স)

যেমন

public interface IGetSomething
{
    public static string Something = "something";
}

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