কেন জেনেরিক পদ্ধতিটি টাইপের পরিবর্তে টাইপ সীমাবদ্ধতার সাথে ব্যবহার করবেন?


14

স্ট্যাক এক্সচেঞ্জের অন্য একটি প্রশ্নে আমি লক্ষ্য করেছি যে কেউ এই প্রোটোটাইপটি ব্যবহার করছেন:

void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
    //Code....
}

মনে রাখবেন কেবল একটি একক ধরণের প্রতিবন্ধকতা ( SomeSpecificReferenceType) রয়েছে, কেবল এটির পরিবর্তে এটি লেখার তফাত এবং সুবিধা কী:

void DoSomething(SomeSpecificReferenceType arg)
{
    //Code....
}

উভয় ক্ষেত্রেই, argসংকলন-টাইপ চেকিং সাপেক্ষে। উভয় ক্ষেত্রেই, পদ্ধতিটির দেহটি নিরাপদে জ্ঞানের উপর নির্ভর করতে পারে argযা সংকলনের সময় পরিচিত একটি নির্দিষ্ট ধরণের (বা এর বংশধর)।

এটি কি সাধারণ উত্তরাধিকার সম্পর্কে শেখার আগে জেনেরিকগুলি সম্পর্কে অতিমাত্রায় বিকাশকারী বিকাশের ঘটনা? বা কোনও পদ্ধতি স্বাক্ষর এইভাবে লেখা হবে কেন একটি বৈধ কারণ আছে?


আমি সবেমাত্র সি # জানি তাই এটি কেবল অনুমান, তবে এটি গতিশীল প্রেরণের পরিবর্তে আরও দক্ষ স্ট্যাটিক প্রেরণ সক্ষম করে না?
আন্তন বারকভস্কি

উত্তর:


13

এটি কি সাধারণ উত্তরাধিকার সম্পর্কে শেখার আগে জেনেরিকগুলি সম্পর্কে অত্যধিক সংবেদনশীল বিকাশকারী শেখার ঘটনা?

হ্যাঁ, সম্ভবত

বা কোনও পদ্ধতি স্বাক্ষর এইভাবে লেখা হবে কেন একটি বৈধ কারণ আছে?

হতে পারে । সাধারণত, এটির সাথে জড়িত কোনও প্রত্যাবর্তন মান Tবা অন্য কোনও প্যারামিটার ব্যবহার করা থাকলে এটি আরও বোঝা যাবে T

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

সুতরাং সীমাবদ্ধ সংস্করণটি প্রয়োজনীয় দেখা খুব কম দেখা যায়, এটির কিছু সময় থাকে। এবং এটা সবসময় সম্ভব যে পদ্ধতি ব্যবহার করা প্রয়োজন তার সাথে, কিন্তু এখন না এবং বিকাশকারী বাম হিসাবে এটি একটি অবিচ্ছিন্ন পরিবর্তন পরিচয় করিয়ে না করা হয়।


1

আমি মনে করি আমি নিজেই এইটি সহ একটি উত্তর টাইপ করেছি।

সেই সময়টির কারণটি এরকম ছিল:
(কোডটি ভিন্ন হতে পারে Just জেনেরিক পদ্ধতিতে টাইপ প্যারামিটারে কেন বাধা রয়েছে তার সম্ভাব্য কারণগুলির মধ্যে একটি ব্যাখ্যা করার জন্য))

class SomeSingleton
{
    static Dictionary<Type, List<object>> staticTypeSpecificList;
    public void AddObjectToList<T>(T t) where T : SomeCommonThing
    {
        Type tt = t.GetType();
        List<object> list;
        if (!staticTypeSpecificList.TryGet(tt, out list))
        {
            list = new List<object>();
            staticTypeSpecificList.Add(tt, list);
        }
        list.Add(t);
    }
}

মূলত, কোডটি ম্যানুয়ালি কোডিং টাইপ ম্যানিপুলেশনগুলিতে আসে। এটি কিছু প্রতিবিম্ব স্টাফের সাথে মিশ্রিতও হতে পারে।

উদাহরণস্বরূপ, ব্যবহার করে Method<T>(T arg) where T : ..., কেউ এর arg.GetType()সাথে প্রতিস্থাপন করতে পারে typeof(T)। যদিও, আমি জানি না যে পছন্দটি ভাল বা খারাপ।

আমি অনুমান করি যে এটি লেখকের (সম্ভবত আমি বা অন্য কেউ) কোডিংয়ের সমস্ত সম্ভাবনার সাথে সাবধানতার সাথে চিন্তা না করে একই সময়ে একটি ভিন্ন প্রশ্ন / ইস্যুতে খুব বেশি মনোযোগ কেন্দ্রীভূত is


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