কেন ইন্টারফেসে সি # 4 alচ্ছিক পরামিতিগুলি ক্লাস প্রয়োগের ক্ষেত্রে প্রয়োগ করা হয় না?


361

আমি লক্ষ করেছি যে সি # 4 এ alচ্ছিক পরামিতিগুলির সাথে যদি আপনি কোনও ইন্টারফেসে alচ্ছিক পরামিতি নির্দিষ্ট করে থাকেন তবে কোনও প্রয়োগকারী শ্রেণিতে সেই পরামিতিটিকে optionচ্ছিক করতে হবে না:

public interface MyInterface
{
    void TestMethod(bool flag = false);
}

public class MyClass : MyInterface
{
    public void TestMethod(bool flag)
    {
        Console.WriteLine(flag);
    }
}

এবং সেইজন্য:

var obj = new MyClass();        
obj.TestMethod(); // compiler error

var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false

Anyoneচ্ছিক পরামিতিগুলি এভাবে কাজ করার জন্য কেন ডিজাইন করা হয়েছে তা কি কেউ জানেন?

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

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


22
কারণ তারা alচ্ছিক?
ওডে

1
কিন্তু আপনাকে বস্তুর উদাহরণস্বরূপ কাস্ট করতে পারেন MyInterfaceএবং ঐচ্ছিক প্যারামিটার দিয়ে সেটিতে কল: ((MyInterface)obj).TestMethod();
জিম মিশেল

7
@ সংযুক্ত - তবে আপনি যদি বলেন যে এই প্যারামিটারটি চুক্তিতে alচ্ছিক, আপনি কেন প্রয়োগকারীকে এটি alচ্ছিক না করার অনুমতি দেন? চুক্তিটি ব্যবহার করতে চাইছেন এমন কারও কি বিভ্রান্তির কারণ নেই?
theburningmonk

1
আমি মনে করি এক্ষেত্রে আপনি বলতে পারেন যে পরামিতি প্রয়োগের ক্ষেত্রে isচ্ছিক, প্রয়োগকারী পদ্ধতিগুলিতে কল করার পরে নয় W আপনি যখন ক্লাসে পদ্ধতিটি কল করেন তখন আপনাকে ক্লাসের নিয়মগুলি মেনে চলতে হবে (ক্লাসে প্যারামিটারটি alচ্ছিক নয় তাই আপনি করতে পারেন) এটি ছাড়া পদ্ধতিটি কল করবেন না) এবং দ্বিতীয় দিকে আপনি যখন ইন্টারফেসটি প্রয়োগ করেন তখন আপনাকে ইন্টারফেসের নিয়মগুলি মেনে চলতে হবে, যাতে আপনি /চ্ছিক পরামিতিগুলি ছাড়াই / পদ্ধতিগুলিকে ওভাররাইড করতে পারেন। শুধু একটি মতামত।
মোহামাদ আলহামউদ

2
আরও বিশদ সমস্যার ব্যাখ্যা এখানে -> geekswithblogs.net/BlackRabbitCoder/archive/2010/06/17/…
অ্যান্ড্রু ওরিচ

উত্তর:


235

আপডেট: এই প্রশ্নটি 12 ই মে 2011 এ আমার ব্লগের বিষয় ছিল great দুর্দান্ত প্রশ্নের জন্য ধন্যবাদ!

ধরুন আপনার বর্ণনা অনুযায়ী একটি ইন্টারফেস রয়েছে এবং এটি বাস্তবায়িত করে এমন একশত শ্রেণি রয়েছে। তারপরে আপনি ইন্টারফেসের যে কোনও একটি পদ্ধতির optionচ্ছিক কোনও একটি পরামিতি তৈরি করার সিদ্ধান্ত নিয়েছেন। আপনি কি পরামর্শ দিচ্ছেন যে সংকলকটি বিকাশকারীকে সেই ইন্টারফেস পদ্ধতির প্রতিটি প্রয়োগ খুঁজে পেতে এবং প্যারামিটারটিকে alচ্ছিকভাবে তৈরি করার জন্য বাধ্যতামূলক করতে হবে?

মনে করুন আমরা এটি করেছি। এখন ধরুন যে বিকাশকারীটির প্রয়োগের জন্য উত্স কোডটি নেই:


// in metadata:
public class B 
{ 
    public void TestMethod(bool b) {}
}

// in source code
interface MyInterface 
{ 
    void TestMethod(bool b = false); 
}
class D : B, MyInterface {}
// Legal because D's base class has a public method 
// that implements the interface method

ডি-র লেখকের এই কাজটি করার কথা কীভাবে? তাদের কী আপনার ফোনে বি এর লেখককে কল করা এবং তাদের বিয়ের একটি নতুন সংস্করণ শিপিয়ে দেওয়ার জন্য জিজ্ঞাসা করা উচিত যা পদ্ধতির একটি alচ্ছিক প্যারামিটার তৈরি করে?

ওটা উড়বে না। দু'জন লোক যদি বি এর লেখককে কল করে এবং তাদের মধ্যে একটি ডিফল্ট সত্য হতে চায় এবং তাদের মধ্যে কেউ এটি মিথ্যা বলে চায়? বি এর লেখক যদি কেবল খেলতে অস্বীকার করেন?

সম্ভবত সে ক্ষেত্রে তাদের বলার প্রয়োজন হবে:

class D : B, MyInterface 
{
    public new void TestMethod(bool b = false)
    {
        base.TestMethod(b);
    }
}

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


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


9
@ সুপের্যাট: আমাদের এটি করার কোনও পরিকল্পনা নেই তবে এর মতো একটি বৈশিষ্ট্যও সম্ভব। এটি আগে প্রস্তাব করা হয়েছে। সি # 4 এর ডিজাইন প্রক্রিয়া চলাকালীন আমরা "এক্সটেনশন সবকিছু" বৈশিষ্ট্যগুলি যা বলেছিলাম তার প্রচুর কাছাকাছি লাথি মেরেছিলাম - আমাদের এক্সটেনশন পদ্ধতি রয়েছে, সুতরাং এক্সটেনশান ইভেন্ট, এক্সটেনশান বৈশিষ্ট্য, এক্সটেনশন কনস্ট্রাক্টর, এক্সটেনশন ইন্টারফেস এবং এর অর্থ কী হবে? । যে শ্রেণিগুলি আপনি ইন্টারফেসগুলিতে "সংযুক্ত" করতে এবং বলতে পারেন যে "এই পদ্ধতিগুলি এই ইন্টারফেসটির ডিফল্ট বাস্তবায়ন" এটি "এক্সটেনশান ইন্টারফেসগুলি" বৈশিষ্ট্যযুক্ত করার একটি সম্ভাব্য উপায়। একটি আকর্ষণীয় ধারণা।
এরিক লিপার্ট

16
কেন আমি মনে করি না যে এটি অ-স্বজ্ঞাত হিসাবে আমার যুক্তিটি স্পষ্ট করার জন্য: আমার কাছে একটি alচ্ছিক প্যারামিটারটি "ইন্টারফেসের প্রয়োগকারীকে" নয় "বিকল্পের কলকারীর কাছে alচ্ছিক"।
স্টিফান ডি কোক

8
"তাদের কি আপনার বিশ্বে প্রয়োজন হয় যে তারা ফোনে বি এর লেখককে কল করুন এবং তাদের দয়া করে একটি নতুন সংস্করণ প্রেরণ করুন [...]?" না, কোনও ফোন কল প্রয়োজন নেই। খ কেবল মাইইন্টারফেসের ইমপ্লিটেশন হিসাবে বিবেচনা করা যায় না এবং সংকলক দ্বারা ডি-র লেখককে সচেতন করা যায়। ডি এর লেখককে ডি টেস্টমেথড দিয়ে ডি প্রয়োগ করতে হবে যেটি কোনও ডিফল্ট প্যারামিটার গ্রহণ করে যেহেতু ইন্টারফেস লেখকের প্রয়োজন - আপনি ইন্টারফেস লেখককে কোনও বাধা প্রয়োগ করতে দেওয়ার বিরোধিতা করছেন কারণ কেউ হয়ত এটি ভেঙে দিতে চায় want এটি একটি ভাল যুক্তি নয়।
ফিলোফিনফিনেটেজেস্ট

7
@ এরিকলিপার্ট এমন ক্ষেত্রে যেখানে কোডিং সুবিধার জন্য alচ্ছিক প্যারামিটার নির্দিষ্ট করা হচ্ছে, হ্যাঁ, বাস্তবায়নে অসুবিধাটি জোর করা স্ব-স্বজ্ঞাত। তবে পদ্ধতি ওভারলোডিং হ্রাস করার জন্য alচ্ছিক প্যারামিটার ব্যবহার করা হচ্ছে এমন একটি শক্তিশালী বৈশিষ্ট্য thoseচ্ছিক মানগুলি তাত্পর্যপূর্ণভাবে তাত্পর্যপূর্ণ হতে পারে এবং এগুলি উপেক্ষা করে অবশ্যই সেই শক্তিটিকে দুর্বল করে দেয়। কংক্রিট বাস্তবায়ন ইন্টারফেসের চেয়ে আলাদা ডিফল্ট মান নির্দিষ্ট করে এমন ক্ষেত্রে উল্লেখ না করা। এটি দেখতে অনুমতি দেওয়ার মতো খুব অদ্ভুত সংযোগের মতো বলে মনে হচ্ছে।
ফিলোফিনফিনেটেজেস্ট

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

47

একটি .চ্ছিক প্যারামিটার কেবল একটি বৈশিষ্ট্যের সাথে ট্যাগ করা হয় tag এই বৈশিষ্ট্যটি কল-সাইটে এই প্যারামিটারের জন্য ডিফল্ট মান সন্নিবেশ করতে কম্পাইলারকে বলে।

কল obj2.TestMethod();দ্বারা প্রতিস্থাপিত হয় obj2.TestMethod(false);যখন C # এর কোড আইএল করার কম্পাইল পরার, এবং জে আই টি JIT-টাইম না।

সুতরাং একটি উপায়ে এটি সর্বদা কলকারী alচ্ছিক পরামিতিগুলির সাথে ডিফল্ট মান সরবরাহ করে। বাইনারি সংস্করণে এর পরিণতিও রয়েছে: আপনি যদি ডিফল্ট মান পরিবর্তন করেন তবে কলিং কোডটি পুনরায় কম্পাইল না করে এটি পুরানো ডিফল্ট মানটি ব্যবহার করতে থাকবে।

অন্যদিকে, এই সংযোগ বিচ্ছিন্ন হওয়ার অর্থ আপনি সর্বদা কংক্রিট বর্গ এবং ইন্টারফেসটি আন্তঃবিনে ব্যবহার করতে পারবেন না।

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


1
আপনি কি প্রয়োগকারীদের স্পষ্টভাবে প্রয়োগ করতে বাধ্য করতে পারেন?
ক্রাশ করুন

30

কারণ ডিফল্ট পরামিতিগুলি রানটাইম নয়, সংকলন সময়ে সমাধান করা হয়। সুতরাং ডিফল্ট মানগুলি কল করা বস্তুর সাথে সম্পর্কিত নয়, তবে যে রেফারেন্সের মাধ্যমে এটি কল করা হচ্ছে তার সাথে সম্পর্কিত।


7

Understandচ্ছিক পরামিতিগুলি আমি যা বুঝি তার থেকে ম্যাক্রো প্রতিস্থাপনের মতো। এগুলি পদ্ধতির দৃষ্টিকোণ থেকে সত্যই .চ্ছিক নয়। এর একটি নিদর্শন হ'ল এমন আচরণ যা আপনি দেখতে পান যেখানে কোনও ইন্টারফেসে কাস্ট করলে আপনি আলাদা ফলাফল পান।

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