কেবলমাত্র আমরা একই পৃষ্ঠায় আছি তা নিশ্চিত করার জন্য, পদ্ধতি "আড়ালকরণ" হ'ল যখন কোনও উদ্ভূত শ্রেণি একই নামের কোনও সদস্যকে বেস শ্রেণীর এক হিসাবে চিহ্নিত করে (যা এটি যদি কোনও পদ্ধতি / সম্পত্তি হয় তবে ভার্চুয়াল / ওভারিডেবল হিসাবে চিহ্নিত না হয়) ), এবং যখন "ডারভেটিড কনটেক্সট" -তে উদ্ভূত শ্রেণীর উদাহরণ থেকে আহ্বান করা হয়, তখন ডেরিভড সদস্যটি ব্যবহৃত হয়, যখন তার বেস বর্গের প্রসঙ্গে একই উদাহরণ দ্বারা আহ্বান করা হলে, বেস শ্রেণীর সদস্য ব্যবহার করা হয়। এটি সদস্য বিমূর্ততা / ওভাররাইডিং থেকে পৃথক যেখানে বেস ক্লাসের সদস্য প্রত্যাশিত শ্রেণীর কোনও প্রতিস্থাপনের সংজ্ঞা দেবে এবং স্কোপ / ভিজিবিলিটি সংশোধনকারী থেকে যে কোনও সদস্যকে কাঙ্ক্ষিত সুযোগের বাইরে গ্রাহকদের কাছ থেকে "আড়াল" করে।
কেন এটি মঞ্জুরি দেওয়া হয়েছে তার সংক্ষিপ্ত উত্তর হ'ল এটি না করা বিকাশকারীদের অবজেক্ট-ওরিয়েন্টেড ডিজাইনের বিভিন্ন মূল নীতি লঙ্ঘন করতে বাধ্য করবে।
এখানে দীর্ঘ উত্তর; প্রথমে বিকল্প মহাবিশ্বে নিম্নলিখিত শ্রেণীর কাঠামোটি বিবেচনা করুন যেখানে সি # সদস্যকে লুকানোর অনুমতি দেয় না:
public interface IFoo
{
string MyFooString {get;}
int FooMethod();
}
public class Foo:IFoo
{
public string MyFooString {get{return "Foo";}}
public int FooMethod() {//incredibly useful code here};
}
public class Bar:Foo
{
//public new string MyFooString {get{return "Bar";}}
}
আমরা বারে সদস্যকে অসন্তুষ্ট করতে চাই এবং এর মাধ্যমে বারকে একটি আলাদা মাইফুস্ট্রিং সরবরাহ করার অনুমতি দিন। তবে, আমরা এটি করতে পারি না কারণ এটি সদস্য গোপনে বিকল্প-বাস্তবতা নিষেধাজ্ঞার লঙ্ঘন করবে। এই বিশেষ উদাহরণটি বাগগুলির জন্য কার্যকর হবে এবং আপনি কেন এটি নিষিদ্ধ করতে চাইতে পারেন তার একটি প্রধান উদাহরণ; উদাহরণস্বরূপ, আপনি নিম্নলিখিতটি করলে কোন কনসোল আউটপুট পাবেন?
Bar myBar = new Bar();
Foo myFoo = myBar;
IFoo myIFoo = myFoo;
Console.WriteLine(myFoo.MyFooString);
Console.WriteLine(myBar.MyFooString);
Console.WriteLine(myIFoo.MyFooString);
আমার মাথার শীর্ষে, আমি আসলে নিশ্চিত নই যে আপনি সেই শেষ লাইনে "ফু" বা "বার" পেয়েছেন কিনা। আপনি তিনটি ভেরিয়েবল একই অবস্থা হিসাবে ঠিক একই উদাহরণ হিসাবে উল্লেখ থাকলেও আপনি অবশ্যই প্রথম লাইনের জন্য "ফু" এবং দ্বিতীয়টির জন্য "বার" পেতে চাইবেন।
সুতরাং, ভাষাটির ডিজাইনাররা, আমাদের বিকল্প মহাবিশ্বে, সম্পত্তি লুকানো রোধ করে এই স্পষ্টত খারাপ কোডটিকে নিরুৎসাহিত করেন। এখন, কোডার হিসাবে আপনার ঠিক এটি করার সত্যিকারের প্রয়োজন। আপনি সীমাবদ্ধতা কাছাকাছি পেতে কিভাবে? ভাল, একটি উপায় হ'ল বারের সম্পত্তির নাম অন্যভাবে দেওয়া:
public class Bar:Foo
{
public string MyBarString {get{return "Bar";}}
}
পুরোপুরি আইনী, তবে এটি আমাদের চাওয়া আচরণ নয়। বারের একটি উদাহরণ মাইফুস্ট্রিং সম্পত্তিটির জন্য সর্বদা "ফু" তৈরি করবে, যখন আমরা এটি "বার" তৈরি করতে চাইতাম। আমাদের আইএফও বিশেষত একটি বার, তা কেবল আমাদের জানতে হবে না, বিভিন্ন অ্যাকসেসরটি ব্যবহার করতে আমাদেরও জানতে হবে।
আমরা বেশ প্রশংসনীয়ভাবে পিতামাতার সাথে সম্পর্কের কথা ভুলে গিয়ে সরাসরি ইন্টারফেসটি প্রয়োগ করতে পারি:
public class Bar:IFoo
{
public string MyFooString {get{return "Bar";}}
public int FooMethod() {...}
}
এই সাধারণ উদাহরণের জন্য এটি একটি নিখুঁত উত্তর, যতক্ষণ না আপনি কেবল খেয়াল রাখবেন যে ফু এবং বার উভয়ই আইফো। কয়েকটি উদাহরণ উদাহরণস্বরূপ ব্যবহার কোড সংকলন করতে ব্যর্থ হবে কারণ একটি বার কোনও ফু নয় এবং এরূপ হিসাবে বরাদ্দ করা যায় না। তবে, ফু এর কাছে বারের প্রয়োজনীয় কিছু কার্যকর পদ্ধতি "FooMethod" থাকলে এখন আপনি সেই পদ্ধতির উত্তরাধিকারী হতে পারবেন না; আপনাকে হয় বারে এর কোডটি ক্লোন করতে হবে, বা সৃজনশীল পেতে হবে:
public class Bar:IFoo
{
public string MyFooString {get{return "Bar";}}
private readonly theFoo = new Foo();
public int FooMethod(){return theFoo.FooMethod();}
}
এটি একটি সুস্পষ্ট হ্যাক এবং ওও ভাষাগুলির কিছু বাস্তবায়ন এর চেয়ে কিছুটা বেশি হলেও ধারণাগতভাবে এটি ভুল; যদি বার প্রয়োজনের ভোক্তাদের foo বিন্যাস এর কার্যকারিতা উন্মোচনের জন্য বার উচিত হবে একটি foo বিন্যাস, না আছে একটি ফু।
স্পষ্টতই, আমরা যদি Foo কে নিয়ন্ত্রণ করি তবে আমরা এটিকে ভার্চুয়াল তৈরি করতে পারি, তারপরে এটিকে ওভাররাইড করব। এটি আমাদের বর্তমান মহাবিশ্বে ধারণাগত সেরা অনুশীলন যখন কোনও সদস্যকে ওভাররাইড করা হবে বলে আশা করা হয় এবং এমন কোনও বিকল্প মহাবিশ্ব ধরে রাখে যা লুকিয়ে থাকতে দেয় না:
public class Foo:IFoo
{
public virtual string MyFooString {get{return "Foo";}}
//...
}
public class Bar:Foo
{
public override string MyFooString {get{return "Bar";}}
}
এটির সাথে সমস্যাটি হ'ল ভার্চুয়াল সদস্য অ্যাক্সেস হুডের নিচে, তুলনামূলকভাবে বেশি ব্যয়বহুল এবং তাই সাধারণত যখন আপনি প্রয়োজন হয় তখন আপনি এটি করতে চান। লুকানোর অভাব, তবে আপনাকে সদস্যদের সম্পর্কে হতাশাব্যঞ্জক হতে বাধ্য করে যা অন্য কোনও কোডার যা আপনার উত্স কোডটি নিয়ন্ত্রণ করে না তা পুনরায় প্রয়োগ করতে চায়; কোনও সিল-না সিল করা শ্রেণীর জন্য "সেরা অনুশীলন" হ'ল ভার্চুয়াল তৈরি করা যদি আপনি বিশেষভাবে এটি না চান। এটি এখনও আপনাকে আড়াল করার সঠিক আচরণ দেয় না; উদাহরণটি বার হলে স্ট্রিং সর্বদা "বার" থাকবে be কখনও কখনও আপনি যে উত্তরাধিকার সূত্রে কাজ করছেন তার উপর ভিত্তি করে গোপনীয় স্টেটের ডেটাগুলির স্তরগুলি উত্সাহিত করতে সত্যই কার্যকর।
সংক্ষেপে, সদস্যকে লুকিয়ে রাখার অনুমতি দেওয়া এই দুস্কর্মগুলি কম হয়। এটি না থাকার কারণে বস্তু-ভিত্তিক নীতিগুলির বিরুদ্ধে এটি করার অনুমতি দেওয়ার চেয়ে আরও বেশি খারাপ অত্যাচারের দিকে পরিচালিত করা হবে।