এক্সটেনশন পদ্ধতির কী কী সুবিধা পেয়েছেন? [বন্ধ]


84

সি # এর একটি "অবিশ্বাসী" আমাকে জিজ্ঞাসা করছিল সম্প্রসারণ পদ্ধতিগুলির উদ্দেশ্য কী। আমি ব্যাখ্যা করেছি যে আপনি ইতিমধ্যে সংজ্ঞায়িত বস্তুগুলিতে নতুন পদ্ধতি যুক্ত করতে পারেন, বিশেষত যখন আপনি মূল অবজেক্টটিতে উত্সটি মালিক / নিয়ন্ত্রণ করেন না।

তিনি তুলে ধরেছিলেন "কেন কেবল নিজের ক্লাসে কোনও পদ্ধতি যুক্ত করবেন না?" আমরা ঘুরে বেড়াচ্ছি (ভাল পথে)। আমার সাধারণ প্রতিক্রিয়া হ'ল এটি টুলবেল্টের অন্য একটি সরঞ্জাম এবং তার প্রতিক্রিয়া হ'ল এটি কোনও সরঞ্জামের অকেজো বর্জ্য ... তবে আমি ভেবেছিলাম আমি আরও "আলোকিত" উত্তর পাব।

এমন কিছু পরিস্থিতি কী কী যা আপনি নিজের শ্রেণীর সাথে যুক্ত পদ্ধতি ব্যবহার করতে পারেননি এমন সম্প্রসারণ পদ্ধতি ব্যবহার করেছেন (বা হওয়া উচিত ছিল না)?


4
আমি মনে করি সম্প্রসারণ পদ্ধতির সমর্থনে লোকেরা অবশ্যই তৈরি করতে পারেন (এবং তৈরি করেছেন) অবশ্যই আছে ... তবে অবশ্যই এমন কোনও দৃশ্য নেই যেখানে এক্সটেনশন পদ্ধতির পরিবর্তে স্থির পদ্ধতি ব্যবহার করতে পারে এমন কেউ " পারে না "। এক্সটেনশন পদ্ধতি সত্যিই হয় মাত্র স্ট্যাটিক পদ্ধতি, অন্যভাবে ব্যবহার করা। কিছু মনে রাখবেন।
ড্যান তাও

@ ডানটাও, একটি হালকা নোটে, এক্সটেনশন পদ্ধতির মাধ্যমে কলকে অপরিবর্তনীয় করে তোলে এমন একটি জিনিস হ'ল তাদের নামকরণ। Extensions.To(1, 10)অর্থহীন এবং 1.To(10)বর্ণনামূলক। অবশ্যই আমি যে প্রযুক্তিগত দিকটির কথা বলছি তা বুঝতে পেরেছি, কেবল বলছি। প্রকৃতপক্ষে এমন পরিস্থিতিতে রয়েছে যেখানে স্থির পদ্ধতির পরিবর্তে এক " এক্সটেনশন পদ্ধতির" ব্যবহার করতে পারেনি , উদাহরণস্বরূপ প্রতিচ্ছবি, অন্য একটি ক্ষেত্রে dynamic
নওফাল

উত্তর:


35

আমি মনে করি কোড লেখার সময় এক্সটেনশন পদ্ধতিগুলি অনেক সাহায্য করে, আপনি যদি মৌলিক ধরণের ক্ষেত্রে এক্সটেনশন পদ্ধতিগুলি যুক্ত করেন তবে আপনি সেগুলি ইন্টেলিসেন্সে দ্রুত পাবেন।

আমার কাছে ফাইল আকারের ফর্ম্যাট করার জন্য একটি ফর্ম্যাট সরবরাহকারী রয়েছে । এটি ব্যবহার করতে আমার লিখতে হবে:

Console.WriteLine(String.Format(new FileSizeFormatProvider(), "{0:fs}", fileSize));

আমি লিখতে পারি একটি এক্সটেনশন পদ্ধতি তৈরি করা:

Console.WriteLine(fileSize.ToFileSize());

ক্লিনার এবং সহজ।


4
আপনার এক্সটেনশন পদ্ধতির আরও বর্ণনামূলক নাম এটিকে আরও ক্লিনার করে তুলবে। যেমন ফাইলসাইজ.টো ফরম্যাট স্ট্রিং ();
ডেভিড আল্পার্ট

4
মিমি, টোফরমেটেডফাইজ সাইজ () হতে পারে, এটি দীর্ঘ প্রকারের জন্য একটি এক্সটেনশন পদ্ধতি, টোফর্ম্যাটড স্ট্রিং () কোনও বর্ণনামূলক নাম নয়
এডুয়ার্ডো ক্যাম্পñó

4
পয়েন্ট তৈরি, যদিও। আমি যখন ফাইলসাইজটি পড়ি। এটা আসলে কি করছে? আমি জানি যে এটি কেবল একটি উদাহরণ, তবে বর্ণনামূলক নামগুলি এটি পরিষ্কার এবং সহজ করে তুলতে সহায়তা করে।
ডেভিড আল্পার্ট

4
আপনি যেমন পরীক্ষা করেছেন ঠিক তেমন সঠিক নামটি বেছে নেওয়া খুব জরুরি
এডুয়ার্ডো ক্যাম্পেইন

4
এটি সত্যই সরাসরি প্রশ্নের উত্তর দিচ্ছে না, যদিও আপনার দেওয়া উদাহরণটি কোনও এক্সটেনশন পদ্ধতি হওয়ার দরকার নেই। আপনি থাকতে পারে LongToFileSize(fileSize), যা ঠিক যেমন সংক্ষিপ্ত এবং তর্কযুক্ত ঠিক ঠিক পরিষ্কার।
ড্যান তাও

83

শুধুমাত্র এক্সটেনশন পদ্ধতি সুবিধা কোড পাঠযোগ্যতা হয়। এটাই.

এক্সটেনশন পদ্ধতিগুলি আপনাকে এটি করার অনুমতি দেয়:

foo.bar();

এর পরিবর্তে:

Util.bar(foo);

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

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


4
আপনি x.Foo (কিছু)। বার (সামথিনজেলিস) .বাজ (তবুও কিছু) কিছুতে শৃঙ্খলাবদ্ধ পদ্ধতি ব্যবহার করতে পারলে এটি আরও বেশি গুরুত্বপূর্ণ হয়ে ওঠে। এটি আইউনামেবল <> এক্সটেনশন পদ্ধতিগুলিতে সর্বাধিক বিস্তৃত এবং পঠনযোগ্যতা উল্লেখযোগ্যভাবে বৃদ্ধি
ShuggyCoUk

4
আমি যে জিনিসটি পাই না তা হ'ল foo.bar () আমার কাছে পরামর্শ দেয় যে বার () foo এর একটি পদ্ধতি। সুতরাং এটি যখন কাজ করে না তখন আমি ভুল জায়গায় সন্ধান করি। আমি নিশ্চিত নই যে এটি আসলে আমার জন্য পাঠযোগ্যতার উন্নতি।
মার্টিন ব্রাউন

4
ভিএস আইডিইতে ডান ক্লিক বার () এবং গোটো সংজ্ঞা সংজ্ঞাটি আপনাকে সঠিক জায়গায় নিয়ে আসবে।
জেফ মার্টিন

9
ভাষা নির্মানগুলির 98% এর একমাত্র সুবিধা হ'ল কোড পাঠযোগ্যতা। আপনার জীবনকে আরও সহজ করার জন্য কোনও শাখা অপারেটর, লেবেল, গোটো এবং ইনক্রিমেন্টের যা কিছু আছে।
জিওভান্নি গাল্বো

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

34

টুলিং ভুলবেন না! আপনি যখন ফু-তে টাইপ করার সময় এক্সটেনশান পদ্ধতি এম যোগ করেন, আপনি ফু এর ইন্টেলিজেন্স তালিকায় 'এম' পাবেন (এক্সটেনশন ক্লাসটি ইন-স্কোপ হিসাবে ধরে নিচ্ছেন)। এটি MyClass.M (ফু, ...) এর চেয়ে 'এম' সন্ধান করা আরও সহজ করে তোলে।

দিনের শেষে, এটি অন্য কোথাও স্থির-পদ্ধতিগুলির জন্য কেবল সিনট্যাকটিক চিনি, তবে বাড়ি কেনার মতো: 'অবস্থান, অবস্থান, অবস্থান!' যদি এটি টাইপটিতে ঝুলে থাকে তবে লোকেরা এটি খুঁজে পাবেন!


4
যেমন একটি লম্বা তালিকা সঙ্গে IntelliSense স্বয়ংসম্পূর্ণ, আপ System.Linq ভরাট থেকে যারা হিসাবে এক্সটেনশন পদ্ধতি (নেভিগেট করা জন্য একটি একটু কঠিন এটি তৈরি: এছাড়াও এই একটি সামান্য নেতিবাচক।
জ্যারেড Updike

@ জ্যারেড: ... তবে কেবলমাত্র আপনি যদি সেই নামস্থানটি আমদানি করে থাকেন যেখানে এক্সটেনশন পদ্ধতিগুলি থাকে, তাই আপনার এই "ইন্টেলিসেন্স দূষণ" এর উপর নিয়ন্ত্রণ কিছুটা হলেও কম রয়েছে। দ্বিতীয়ত, আসুন ভুলে যাবেন না যে ছাত্রলীগে ক্লাস রয়েছে (যেমন String) উদাহরণ পদ্ধতিগুলির জন্য দীর্ঘ দীর্ঘ তালিকা নিয়ে আসে, সুতরাং এই সমস্যাটি এক্সটেনশন পদ্ধতির সাথে নির্দিষ্ট নয়।
স্টাকেক্স -

29

এক্সটেনশন পদ্ধতির আরও দুটি সুবিধা যা আমি এসেছি:

  • একটি সাবলীল ইন্টারফেসটি এক্সটেনশন পদ্ধতির একটি স্ট্যাটিক শ্রেণিতে আবদ্ধ করা যায়, যার ফলে মূল শ্রেণীর মধ্যে উদ্বেগের একটি পৃথকীকরণ অর্জন হয় এবং এটি সাবলীল এক্সটেনশানগুলি হয়; আমি দেখেছি যে বৃহত্তর রক্ষণাবেক্ষণ অর্জন।
  • এক্সটেনশন পদ্ধতিগুলি ইন্টারফেসের বাইরে ঝুলিয়ে দেওয়া যেতে পারে, যার ফলে আপনাকে একটি চুক্তি (ইন্টারফেসের মাধ্যমে) এবং ইন্টারফেস-ভিত্তিক আচরণের একটি সংযুক্ত সিরিজ (এক্সটেনশন পদ্ধতির মাধ্যমে) নির্দিষ্ট করার সুযোগ দেয়, আবার উদ্বেগের পৃথকীকরণের প্রস্তাব দেয়। একটি উদাহরণ Linq এক্সটেনশন পদ্ধতি মত Select(...), Where(...)ইত্যাদি স্তব্ধ বন্ধ IEnumerable<T>ইন্টারফেস।

4
আপনি দয়া করে উভয় পয়েন্টের জন্য কিছু কোড উদাহরণ উদ্ধৃত করতে পারেন যাতে তারা আরও ভালভাবে বুঝতে পারে? এটি একটি আকর্ষণীয় ভিউ পয়েন্ট বলে মনে হচ্ছে।
আরবিটি

হ্যাঁ ২ য় পয়েন্টের জন্য উদাহরণটি চমৎকার হবে।
ইনি

26

এক্সটেনশন পদ্ধতিগুলির জন্য আমার কাছে সবচেয়ে ভাল ব্যবহারগুলি হ'ল ক্ষমতা:

  1. তৃতীয় পক্ষের অবজেক্টগুলিতে কার্যকারিতা প্রসারিত করুন (আমার প্রতিষ্ঠানের বাণিজ্যিক বা অভ্যন্তরীণ তবে পৃথক গোষ্ঠী দ্বারা পরিচালিত হোক), যা অনেক ক্ষেত্রে চিহ্নিত করা হবে sealed
  2. একটি বিমূর্ত শ্রেণি প্রয়োগ না করে ইন্টারফেসের জন্য ডিফল্ট কার্যকারিতা তৈরি করুন

উদাহরণস্বরূপ নিন IEnumerable<T>,। যদিও এটি এক্সটেনশন পদ্ধতিতে সমৃদ্ধ, আমি বিরক্তিকর হয়ে উঠলাম যে এটি জেনেরিক ফরইচ পদ্ধতি প্রয়োগ করে নি। সুতরাং, আমি আমার নিজের তৈরি করেছি:

public void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach ( var o in enumerable )
    {
        action(o);
    }
}

ভয়েলা, আমার সমস্ত IEnumerable<T>বস্তু প্রয়োগের ধরণ নির্বিশেষে, এবং আমি এটি লিখেছি বা না করেছি আমার ForEachকোডটিতে একটি উপযুক্ত "ব্যবহার" বিবৃতি যুক্ত করে এখন অন্য কোনও পদ্ধতি আছে ।


4
+1 আমি এই এক্সটেনশনটি পছন্দ করি, আমি এটির মতো একটি লিখেছি। তাই খুব দরকারী
মাসলো

10
নোট করুন যে পদ্ধতিটি অচল হতে হবে। এই এক্সটেনশনটি ব্যবহারের সিদ্ধান্ত নেওয়ার আগে আমি ব্লগস.এমএসডএন.com/ericlippert/archive/2009/05/18/… পড়ার পরামর্শ দিই
ট্রুউইল

অহেতুক কেন IEnumerable উপর বাস্তবায়ন foreach এক্সটেনশন পদ্ধতি প্রশংসা না - blogs.msdn.microsoft.com/ericlippert/2009/05/18/...
RBT

12

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


4
এটি 'একটির' নয়, এটি সম্প্রসারণ পদ্ধতির কারণ।
gbjbaanb

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

আমি মনে করি তিনি বোঝাতে চেয়েছিলেন যে এগুলি কারণ তাদের তৈরি করা হয়েছিল তবে হ্যাঁ, তিনি এটিকে এমন মনে করেন যে তারা তাদের জন্য একমাত্র সঠিক ব্যবহার।
ব্রেন্ট রিতেনহাউস

9

এক্সটেনশন পদ্ধতির সুবিধা সম্পর্কে প্রচুর উত্তর রয়েছে ; কীভাবে একজন অসুবিধাগুলি সমাধান করছেন ?

সবচেয়ে বড় অসুবিধা হ'ল যদি আপনার নিয়মিত পদ্ধতি এবং একই প্রসঙ্গে একই স্বাক্ষর সহ একটি এক্সটেনশন পদ্ধতি থাকে তবে কোনও সংকলক ত্রুটি বা সতর্কতা নেই।

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

আপনার কোডটি সংকলন করবে এবং আপনি রানটাইম ত্রুটি নাও পেতে পারেন। তবে আপনি আর আগের মতো কোড চালাচ্ছেন না।


4
৪. আপনার নিজের মতো নয় এমন প্রকারগুলি বাড়ানোর আগে দু'বার ভাবেন । আপনি যদি কেবল নিজের মালিকানার ধরণের জন্য এক্সটেনশন পদ্ধতিগুলি লিখেন তবে আপনার প্রসারিত প্রকারের পরিবর্তনের দ্বারা আপনার এক্সটেনশনগুলি ভেঙে যাওয়ার বিষয়ে কখনই চিন্তা করতে হবে না। অন্যদিকে, আপনি যদি অন্যরকম প্রকারগুলি প্রসারিত করেন তবে মূলত তাদের করুণায়।
ডেভিডআরআর

4
... বিকল্পভাবে, আপনি অন্য যে কোনও ব্যক্তির দ্বারা ব্যবহারের সম্ভাবনা নেই এমন নামগুলি বেছে নিয়ে বা আপনার সংজ্ঞায়িত মোট এক্সটেনশন পদ্ধতির সংখ্যা কমিয়ে (অর্থাত্ পৃষ্ঠের অঞ্চল হ্রাস) দ্বারা এই ঝুঁকি হ্রাস করতে পারেন। এটি করার জন্য একটি কৌশল হতে পারে একটি এক্সটেনশন পদ্ধতি লিখুন যা অন্তর্নিহিত অবজেক্টটিকে একটি ভিন্ন ধরণের রূপান্তর করে যা আপনার দ্বারা নিয়ন্ত্রিত হয়।
ডেভিডআরআর

সম্প্রসারণের পদ্ধতিগুলি (সি # প্রোগ্রামিং গাইড) : সাধারণত, আপনি সম্ভবত নিজের প্রয়োগের চেয়ে বেশি বার বার এক্সটেনশন পদ্ধতিগুলি কল করবেন।
ডেভিডআরআর


4

এক্সটেনশন পদ্ধতিগুলির জন্য আমার ব্যক্তিগত যুক্তি হ'ল এগুলি ওওপি ডিজাইনের সাথে খুব ভাল ফিট করে: সহজ পদ্ধতিটি বিবেচনা করুন

bool empty = String.IsNullOrEmpty (myString)

তুলনামূলক ভাবে

bool empty = myString.IsNullOrEmpty ();

আপনার উদাহরণটি ওওপি-র সাথে কী করতে হবে তা আমি দেখতে পাচ্ছি না। আপনি কি বোঝাতে চেয়েছেন?
অ্যান্ড্রু হ্যারে

4
এটি "মনে হয়" যে পদ্ধতিটি অবজেক্টটির অন্তর্গত
ব্লুয়ানুয়ান্স

4
এটি একটি খারাপ উদাহরণ (নালরাইফারেন্সএক্সপশন নিক্ষেপ করতে পারে) তবে তিনি সঠিক পথে আছেন। এর চেয়ে ভাল উদাহরণ হতে পারে ম্যাথ.এবস (-4) এর পরিবর্তে -4.abs () এর মতো কিছু;
আউটলা প্রোগ্রামার 15

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

4
আমি ব্যক্তিগতভাবে এক্সটেনশন পদ্ধতির অনুরাগী নই যা নাল উদাহরণ দিয়ে কাজ করার উদ্দেশ্যে করা হয়েছে - এটি পাঠকের কাছে এক জিনিস বলে মনে হয় তবে অন্য কিছু করে।
মার্ক সিম্পসন

4

আপনাকে কী কী এক্সটেনশন পদ্ধতিগুলি করতে দেয় সে সম্পর্কে উপরে দুর্দান্ত উত্তরের সন্ধান রয়েছে।

আমার সংক্ষিপ্ত উত্তরটি হ'ল - তারা কারখানার প্রয়োজন প্রায় দূর করে eliminate

আমি কেবল উল্লেখ করব যে এগুলি কোনও নতুন ধারণা নয় এবং এর মধ্যে অন্যতম বৃহত্তম বৈধতা হ'ল তারা উদ্দেশ্য-সি ( বিভাগসমূহ ) এর একটি হত্যাকারী বৈশিষ্ট্য । তারা কাঠামো ভিত্তিক বিকাশে এতটা নমনীয়তা যুক্ত করেছে যে বড় ব্যবহারকারী হিসাবে এনএক্সটি এনএসএ এবং ওয়াল স্ট্রিট আর্থিক মডেলারদের ছিল।

রিয়ালবাসিক এগুলি প্রসারিত পদ্ধতি হিসাবে প্রয়োগ করে এবং সেখানে উন্নয়নের সরলকরণের ক্ষেত্রে তাদের অনুরূপ ব্যবহার ছিল।


4

আমি এখানে অন্যান্য উত্তরগুলিকে সমর্থন করতে চাই যেগুলি বর্ধিত পদ্ধতির পিছনে একটি গুরুত্বপূর্ণ কারণ হিসাবে উন্নত কোড পাঠযোগ্যতার উল্লেখ করেছে। আমি এটির দুটি দিক দিয়ে এটিকে প্রদর্শন করব: পদ্ধতিতে শৃঙ্খলাবদ্ধ বনাম নেস্টেড পদ্ধতি কলগুলি, এবং অর্থহীন স্ট্যাটিক শ্রেণীর নামগুলির সাথে একটি লিনকিউ কোয়েরি বিশৃঙ্খলা।


উদাহরণস্বরূপ এই লিনকিউ কোয়েরিটি নেওয়া যাক:

numbers.Where(x => x > 0).Select(x => -x)

উভয়ই Whereএবং Selectস্ট্যাটিক শ্রেণিতে সংজ্ঞায়িত এক্সটেনশন পদ্ধতি Enumerable। সুতরাং, যদি সম্প্রসারণের পদ্ধতিগুলি উপস্থিত না থাকে এবং এগুলি সাধারণ স্থিতিশীল পদ্ধতি ছিল তবে কোডের শেষ লাইনটি মূলত: এর মতো দেখতে হবে:

Enumerable.Select(Enumerable.Where(numbers, x => x > 0), x => -x)

সন্ধানটি সবেমাত্র কীভাবে পেল তা দেখুন।


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

Enumerable.Select(MyEnumerableExtensions.RemoveNegativeNumbers(numbers), x => -x)
//                ^^^^^^^^^^^^^^^^^^^^^^
//                different class name that has zero informational value
//                and, as with 'Enumerable.xxxxxx', only obstructs the
//                query's actual meaning.

3

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


3

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

সুবিধাগুলি: আপনার সংজ্ঞায়িত শ্রেণির সমাবেশে নির্ভরতা কেবল খালি প্রয়োজনীয়তায় কমেছে এবং অন্যান্য গ্রাহক সমাবেশগুলি ToXML () পদ্ধতি ব্যবহার করা থেকে বিরত থাকবে। আরও রেফারেন্সের জন্য এই PDC উপস্থাপনা দেখুন ।


3

আমি সম্মত হই যে এক্সটেনশন পদ্ধতিগুলি কোডের পঠনযোগ্যতা বৃদ্ধি করে তবে এটি স্থিতিশীল সহায়তা পদ্ধতি ছাড়া অন্য কিছু নয়।

আইএমও আপনার ক্লাসে আচরণ যুক্ত করার জন্য এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে:

বিভ্রান্তিকর: প্রোগ্রামাররা বিশ্বাস করতে পারে যে পদ্ধতিগুলি বর্ধিত ধরণের একটি অংশ, যাতে এভাবে বোঝা যায় না যে যখন এক্সটেনশান-নেমস্পেসটি আমদানি করা হয় না তখন কেন পদ্ধতিগুলি চলে যায়।

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


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

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

2

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


4
+1, তবে নোট করুন যে আপনি ইন্টারফেসগুলির সাথে এক্সটেনশন পদ্ধতিগুলিও ব্যবহার করতে পারেন।
ট্রুউইল

2

আমি মূলত প্রসারিত পদ্ধতিগুলিকে একটি ভর্তি হিসাবে দেখি যা সম্ভবত তাদের ফ্রি ফাংশনগুলি অস্বীকার করা উচিত নয়।

সি ++ সম্প্রদায়গুলিতে সদস্যদের তুলনায় ফ্রি ননমেম্বার ফাংশনগুলিকে পছন্দ করা প্রায়শই ভাল ওওপি অনুশীলন হিসাবে বিবেচিত হয়, কারণ এই ফাংশনগুলি তাদের প্রয়োজন নেই এমন ব্যক্তিগত সদস্যদের অ্যাক্সেস অর্জনের মাধ্যমে এনক্যাপসুলেশনটি ভেঙে দেয় না। একই জিনিস অর্জনের জন্য প্রসারণ পদ্ধতিগুলি একটি চক্রাকার উপায় বলে মনে হচ্ছে। এটি হ'ল স্ট্যাটিক ফাংশনগুলির জন্য একটি ক্লিনার সিনট্যাক্স যার ব্যক্তিগত সদস্যদের অ্যাক্সেস নেই।

এক্সটেনশন পদ্ধতিগুলি সিনট্যাকটিক চিনি ছাড়া আর কিছুই নয়, তবে এগুলি ব্যবহারে আমি কোনও ক্ষতি দেখতে পাচ্ছি না।


2
  • কিছু কুৎসিত ইউটিলিটি ফাংশন কল করার পরিবর্তে অবজেক্টটিতে নিজেই ইন্টেলিজেন্স
  • রূপান্তর ফাংশনগুলির জন্য, "XToY (X x)" কে "ToY (এই X x)" এ পরিবর্তন করতে পারে যার ফলস্বরূপ কুৎসিত XToY (x) এর পরিবর্তে সুন্দর x.ToY () ফলাফল হয় in
  • আপনার নিয়ন্ত্রণ নেই এমন ক্লাসগুলি প্রসারিত করুন
  • ক্লাসগুলির কার্যকারিতা প্রসারিত করুন যখন ক্লাসে নিজেরাই পদ্ধতি যুক্ত করার জন্য এটি অনাকাঙ্ক্ষিত। উদাহরণস্বরূপ, আপনি ব্যবসায়িক বিষয়গুলি সহজ এবং যুক্তি-মুক্ত রাখতে পারেন এবং এক্সটেনশন পদ্ধতিতে কুশল নির্ভরতার সাথে নির্দিষ্ট ব্যবসায়িক যুক্তি যুক্ত করতে পারেন

2

আমি আমার বস্তু মডেল ক্লাস পুনরায় ব্যবহার করতে সেগুলি ব্যবহার করি। আমার কাছে ক্লাসগুলির একটি গুচ্ছ রয়েছে যা আমার কাছে একটি ডাটাবেসে থাকা অবজেক্টগুলিকে প্রতিনিধিত্ব করে। এই ক্লাসগুলি ক্লায়েন্টের পক্ষে কেবল অবজেক্টগুলি প্রদর্শন করতে ব্যবহার করা হয় তাই প্রাথমিক ব্যবহার বৈশিষ্ট্যগুলি অ্যাক্সেস করা হয়।

public class Stock {
   public Code { get; private set; }
   public Name { get; private set; }
}

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

public static class StockExtender {
    public static List <Quote> GetQuotesByDate(this Stock s, DateTime date)
    {...}
}

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

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


4
আপনি এর জন্য আংশিক ক্লাস ব্যবহার করতে পারেন ...
JJoos


1

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


1

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

এক্সটেনশন পদ্ধতিগুলি ক্লায়েন্ট-সাইডে অন্য কোনও অবজেক্ট মডেল বা অসংখ্য মোড়কের ক্লাস তৈরি না করে ওয়েব পদ্ধতি দ্বারা ফেরত প্রকারগুলিতে (ক্লায়েন্টের পাশে) কার্যকারিতা যুক্ত করার অনুমতি দেয় allowed


1

সি # তে এক ধরণের মেশিন তৈরি করতে এক্সটেনশন পদ্ধতিগুলি ব্যবহার করা যেতে পারে ।

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

এটি ডিসিআই আর্কিটেকচারের কেন্দ্রীয় ধারণা সি # তেও ভূমিকা সক্ষম করতে ব্যবহার করা যেতে পারে ।


1

এছাড়াও মনে রাখবেন যে লিনক ক্যোয়ারিকে তাদের সি # শৈলীতে ব্যবহার করার সময় আরও পঠনযোগ্য হতে সহায়তা করার জন্য এক্সটেনশন পদ্ধতিগুলি যুক্ত করা হয়েছিল।

এই 2 প্রভাবগুলি একেবারে সমতুল্য, তবুও প্রথমটি আরও বেশি পাঠযোগ্য (

int n1 = new List<int> {1,2,3}.Where(i => i % 2 != 0).Last();

int n2 = Enumerable.Last(Enumerable.Where(new List<int> {1,2,3}, i => i % 2 != 0));

দ্রষ্টব্য যে সম্পূর্ণরূপে যোগ্যতাসম্পন্ন বাক্য গঠনটি এমনও হওয়া উচিত:

int n1 = new List<int> {1,2,3}.Where<int>(i => i % 2 != 0).Last<int>();

int n2 = Enumerable.Last<int>(Enumerable.Where<int>(new List<int> {1,2,3}, i => i % 2 != 0));

সুযোগক্রমে , টাইপ পরামিতিগুলির Whereএবং Lastস্পষ্টভাবে উল্লেখ করার প্রয়োজন নেই কারণ এ দুটি পদ্ধতির প্রথম প্যারামিটারের উপস্থিতি (কীওয়ার্ড দ্বারা প্রবর্তিত প্যারামিটারের জন্য তাদের ধন্যবাদ জানানো যেতে পারে)this এবং তাদের এক্সটেনশন পদ্ধতি করা)।

স্পষ্টতই এই পয়েন্টটি এক্সটেনশন পদ্ধতিগুলির একটি সুবিধা (অন্যদের মধ্যে), এবং আপনি এর অনুরূপ প্রতিটি দৃশ্যে এর থেকে সুবিধা নিতে পারেন যেখানে পদ্ধতিতে শৃঙ্খলা জড়িত।

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

উদাহরণ (ঠিক আছে, এই দৃশ্যটি সম্পূর্ণ চিত্তাকর্ষক): একটি শুভরাত্রির পরে, একটি প্রাণী চোখ খোলে তারপরে চিৎকার দেয়; প্রতিটি প্রাণী একইভাবে চোখ খুলে দেয়, যেখানে একটি কুকুর ছোঁয়া এবং হাঁসের কোয়াক্স।

public abstract class Animal
{
    //some code common to all animals
}

public static class AnimalExtension
{
    public static TAnimal OpenTheEyes<TAnimal>(this TAnimal animal) where TAnimal : Animal
    {
        //Some code to flutter one's eyelashes and then open wide
        return animal; //returning a self reference to allow method chaining
    }
}

public class Dog : Animal
{
    public void Bark() { /* ... */ }
}

public class Duck : Animal
{
    public void Kwak() { /* ... */ }
}

class Program
{
    static void Main(string[] args)
    {
        Dog Goofy = new Dog();
        Duck Donald = new Duck();
        Goofy.OpenTheEyes().Bark(); //*1
        Donald.OpenTheEyes().Kwak(); //*2
    }
}

ধারণাগতভাবে OpenTheEyesএকটি Animalপদ্ধতি হওয়া উচিত , তবে এটি বিমূর্ত শ্রেণির একটি উদাহরণ ফিরে আসতে Animalপারে, যা নির্দিষ্ট সাবক্লাস পদ্ধতিগুলি যেমন Barkবা যা কিছু জানে না Duck। 2 টি লাইন * 1 এবং * 2 হিসাবে মন্তব্য করেছে তারপরে একটি সংকলন ত্রুটি বাড়িয়ে তুলবে।

তবে এক্সটেনশন পদ্ধতিগুলির জন্য ধন্যবাদ, আমাদের কাছে এমন একটি "বেস পদ্ধতি থাকতে পারে যা সাবক্লাসের ধরণটি জানায় যার উপর এটি বলা হয়"।

মনে রাখবেন যে একটি সাধারণ জেনেরিক পদ্ধতিটি কাজটি করতে পারত তবে আরও বিশ্রী পদ্ধতিতে:

public abstract class Animal
{
    //some code common to all animals

    public TAnimal OpenTheEyes<TAnimal>() where TAnimal : Animal
    {
        //Some code to flutter one's eyelashes and then open wide
        return (TAnimal)this; //returning a self reference to allow method chaining
    }
}

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

Goofy.OpenTheEyes<Dog>().Bark();
Donald.OpenTheEyes<Duck>().Kwak();

... যা আরও শৃঙ্খলা জড়িত থাকলে কোডটি অনেকটা ওজন করতে পারে (বিশেষত জেনে থাকুন যে টাইপ প্যারামিটারটি সর্বদা <Dog>গোফির লাইনে এবং <Duck>ডোনাল্ডের একটিতে থাকবে ...)


4
প্রথমবার আমি কখনও "কোয়াক" দেখেছি। এটি কি এমন বানান যা অন্য দেশে প্রচলিত? আমি এর বানানটি দেখেছি কেবলমাত্র "ক্র্যাক"।
ব্রেন্ট রিতেনহাউস

0

এটির বিষয়ে আমার কাছে কেবল একটি শব্দ আছে: অব্যবহারের পদ্ধতি ব্যবহারের জন্য এটি মূল কী the


4
আমি মনে করি আপনার একাধিক শব্দের প্রয়োজন হতে পারে কারণ এর অর্থ কী তা আমি বুঝতে পারি না।
আউটলা প্রোগ্রামার 15

4
আমি আসলে এটি বলতে পারি যে এটি এক্সটেনশন পদ্ধতির বিরুদ্ধে একটি যুক্তি । এক্সটেনশন পদ্ধতিগুলির একটি ঝুঁকি হ'ল এগুলি সর্বত্রই হতে পারে, যা সবার দ্বারা তৈরি। সতর্কতার সাথে ব্যবহার না করা হলে ওয়াইল্ডগ্রো ঘটতে পারে।
বরিস কলেনস

আপনি ইএম ব্যবহার করার সময় সমস্ত রেফারেন্স সহজেই খুঁজে পেতে পারেন। এছাড়াও, বিশ্বব্যাপী একটি পদ্ধতি পরিবর্তন করতে, আপনি কেবল এটি এক জায়গা থেকে করতে পারেন
তামির

0

আমি মনে করি এক্সটেনশন পদ্ধতিগুলি কোড স্পষ্ট করে লিখতে সহায়তা করে।

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

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


0

এটি আপনার সম্পাদক / আইডিইটিকে স্বতঃ-সম্পূর্ণ পরামর্শ স্মার্ট করতে দেয়।


0

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

        HTML_Out.Append("<ul>");
        foreach (var i in items)
            if (i.Description != "")
            {
                HTML_Out.Append("<li>")
                    .AppendAnchor(new string[]{ urlRoot, i.Description_Norm }, i.Description)
                    .Append("<div>")
                    .AppendImage(iconDir, i.Icon, i.Description)
                    .Append(i.Categories.ToHTML(i.Description_Norm, urlRoot)).Append("</div></li>");
            }

        return HTML_Out.Append("</ul>").ToString();

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


0

নেস্টেড জেনেরিক আর্গুমেন্টগুলি মেলাতে এক্সটেনশন পদ্ধতিগুলি দরকারী found

এটি কিছুটা বেহাল মনে হচ্ছে - তবে বলুন যে আমাদের একটি জেনেরিক ক্লাস রয়েছে MyGenericClass<TList>এবং আমরা জানি যে টিএলিস্টটি নিজেই জেনেরিক (যেমন একটিList<T> ), আমি মনে করি না যে তালিকা থেকে সেই নেস্টেড 'টি' বের করার কোনও উপায় নেই যার দ্বারা কোনও এক্সটেনশান না করেই রয়েছে dig পদ্ধতি বা স্থির সহায়ক পদ্ধতি er আমাদের যদি কেবল আমাদের নিষ্পত্তি স্থিতিশীল সহায়তা পদ্ধতি থাকে তবে এটি (ক) কুরুচিপূর্ণ এবং (খ) আমাদের ক্লাসে অন্তর্ভুক্ত কার্যকারিতা একটি বাহ্যিক স্থানে সরাতে বাধ্য করবে।

উদাহরণস্বরূপ একটি টিউপলে প্রকারগুলি পুনরুদ্ধার করতে এবং এটিকে একটি পদ্ধতি স্বাক্ষরে রূপান্তর করতে আমরা এক্সটেনশন পদ্ধতিগুলি ব্যবহার করতে পারি:

public class Tuple { }
public class Tuple<T0> : Tuple { }
public class Tuple<T0, T1> : Tuple<T0> { }

public class Caller<TTuple> where TTuple : Tuple { /* ... */ }

public static class CallerExtensions
{
     public static void Call<T0>(this Caller<Tuple<T0>> caller, T0 p0) { /* ... */ }

     public static void Call<T0, T1>(this Caller<Tuple<T0, T1>> caller, T0 p0, T1 p1) { /* ... */ }
}

new Caller<Tuple<int>>().Call(10);
new Caller<Tuple<string, int>>().Call("Hello", 10);

এটি বলেছিল, আমি নিশ্চিত না যে বিভাজক রেখাটি কোথায় হওয়া উচিত - কখন কোনও পদ্ধতিটি কোনও এক্সটেনশন পদ্ধতি হওয়া উচিত এবং কখন এটি একটি স্ট্যাটিক সহায়ক পদ্ধতি হওয়া উচিত? কোন চিন্তা?


0

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

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

এক্সটেনশন পদ্ধতি সহ, আমি এটি করতে পারি:

1) ওয়েবকন্ট্রোল ক্লাস প্রসারিত করুন এবং তারপরে আমার সমস্ত ইনপুট ক্লাসে আমার একীভূত মানক আচরণ করুন

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


0

এক্সটেনশন পদ্ধতিগুলির অনেকগুলি দুর্দান্ত উদাহরণ রয়েছে ... উপরের পোস্ট অনুসারে আইএনমেবারেবলগুলিতে বিশেষভাবে।

উদাহরণস্বরূপ, যদি আমার কাছে একটি থাকে তবে এর জন্য আমি IEnumerable<myObject>তৈরি করতে পারি এবং এক্সটেনশন পদ্ধতিটি তৈরি করতে পারিIEnumerable<myObject>

mylist List<myObject>;

... তালিকা তৈরি করুন

mylist.DisplayInMyWay();

এক্সটেনশন পদ্ধতি ছাড়াই কল করতে হবে:

myDisplayMethod(myOldArray); // can create more nexted brackets.

আরেকটি দুর্দান্ত উদাহরণ একটি ফ্ল্যাশগুলিতে একটি বিজ্ঞপ্তিযুক্ত লিঙ্কযুক্ত তালিকা তৈরি করছে!

আমি 'এর কৃতিত্ব নিতে পারি!

বৃত্তাকার লিঙ্কযুক্ত তালিকা এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে

এখন এগুলিকে একত্রিত করুন এবং এক্সটেনশন পদ্ধতিগুলি কোডটি নীচের হিসাবে ব্যবহার করুন।

myNode.NextOrFirst().DisplayInMyWay();

বরং

DisplayInMyWay(NextOrFirst(myNode)).

এক্সটেনশন পদ্ধতিগুলি ব্যবহার করা এটি পড়ার চেয়ে সহজ এবং সহজ এবং আরও বেশি অবজেক্ট ওরিয়েন্টেটেড। খুব কাছাকাছি:

myNode.Next.DoSomething()

এটি আপনার কলেজকে দেখান! :)

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