২০০০ এর দশকে আমার এক সহকর্মী আমাকে বলেছিলেন যে পাবলিক পদ্ধতিগুলি ভার্চুয়াল বা বিমূর্ত করার পক্ষে এটি একটি বিরোধী-নিদর্শন।
উদাহরণস্বরূপ, তিনি এমন একটি শ্রেণি বিবেচনা করেছেন যা এটির নকশা ভাল নয়:
public abstract class PublicAbstractOrVirtual
{
public abstract void Method1(string argument);
public virtual void Method2(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
// default implementation
}
}
তিনি বলেছেন যে
- একটি উদ্ভূত শ্রেণীর বিকাশকারী যা প্রয়োগ
Method1
এবং ওভাররাইডগুলিMethod2
যুক্তির বৈধতা পুনরুদ্ধার করতে হয়। - বেস শ্রেণীর বিকাশকারী
Method1
বা তারMethod2
পরে কাস্টমাইজযোগ্য অংশের কিছু যুক্ত করার সিদ্ধান্ত নিলে সে এটি করতে পারে না cannot
পরিবর্তে আমার সহকর্মী এই পদ্ধতির প্রস্তাব করেছিলেন:
public abstract class ProtectedAbstractOrVirtual
{
public void Method1(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
this.Method1Core(argument);
}
public void Method2(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
this.Method2Core(argument);
}
protected abstract void Method1Core(string argument);
protected virtual void Method2Core(string argument)
{
// default implementation
}
}
তিনি আমাকে বলেছিলেন যে পাবলিক পদ্ধতিগুলি (বা বৈশিষ্ট্যগুলি) ভার্চুয়াল বা বিমূর্ত ব্যবহার করা ক্ষেত্রগুলি সর্বজনীন করার মতোই খারাপ। ক্ষেত্রগুলিকে বৈশিষ্ট্যগুলিতে মোড়ানো দ্বারা যদি প্রয়োজন হয় তবে পরে সেই ক্ষেত্রগুলিতে যে কোনও অ্যাক্সেস বাধা দিতে পারে। এটি একইসাথে পাবলিক ভার্চুয়াল / বিমূর্ত সদস্যদের ক্ষেত্রে প্রযোজ্য: ProtectedAbstractOrVirtual
ক্লাসে যেমন দেখানো হয়েছে তেমনভাবে মোড়ানো বেস ক্লাস বিকাশকারীকে ভার্চুয়াল / অ্যাবস্ট্রাক্ট পদ্ধতিগুলিতে যাওয়া কোনও কলকে বাধা দিতে দেয়।
তবে আমি এটিকে ডিজাইনের গাইডলাইন হিসাবে দেখছি না। মাইক্রোসফ্টও এটি অনুসরণ করে না: এটি Stream
যাচাই করার জন্য ক্লাসটি একবার দেখুন ।
আপনি এই গাইডলাইনটি সম্পর্কে কী ভাবেন? এটি কি কোনও অর্থবোধ করে না, বা আপনার কি মনে হয় এটি এপিআইকে অত্যধিক জটিল করে তুলছে?
protected
যখন আপনি বিমূর্ত শ্রেণীর ব্যক্তিগত সদস্যদের উদ্ভূত শ্রেণীর কাছে প্রকাশ করতে চান তখন সর্বাধিক কার্যকর। যাই হোক না কেন, আমি আপনার বন্ধুর মতামত সম্পর্কে বিশেষভাবে উদ্বিগ্ন নই; অ্যাক্সেস মডিফায়ারটি চয়ন করুন যা আপনার নির্দিষ্ট পরিস্থিতির জন্য সর্বাধিক উপলব্ধি করে।
virtual
alচ্ছিক ওভাররাইডের অনুমতি দেয়। আপনার পদ্ধতি সম্ভবত সর্বজনীন হওয়া উচিত, কারণ এটি ওভাররাইড নাও হতে পারে। পদ্ধতি তৈরিabstract
আপনাকে সেগুলি ওভাররাইড করতে বাধ্য করে; তাদের সম্ভবত হওয়া উচিতprotected
, কারণ তারা একটিpublic
প্রসঙ্গে বিশেষভাবে কার্যকর নয় ।