همانطور که در پست قبل مشاهده کردید ما یه نگاه اجمالی به موضوع Variance داشتیم و در این پست میخوایم سراغ فیچر دیگه به اسم Invariance بریم اما قبل از شروع بهتره به عنوان یادآوری به تعریف دو کلمه More Derived و Less Derived یه نگاهی بندازیم:
- More Derived : به Subclass یا کلاس فرزند به اصطلاح More Derived میگیم.
- Less Derived : به Superclass یا کلاس پدر به اصلاح Less Derived میگیم.
خوب بریم سمت موضوع خودمون، فرض کنید همچین کدی داریم: string ilmaz1 = "ilmaz1";
مقدار “ilmaz1 “رو به یک متغیر string تخصیص دادیم!
خوب اگر اینسری جای string رو با object عوض کنیم به این صورت object ilmaz2 = "ilmaz2"
می بینیم “ilmaz2” که More Derived بدون مشکل به object که Less Derived هست بدون مشکل تخصیص داده میشه!
حالا بریم یه کار دیگه ای بکنیم، بریم متغیر ilmaz2 رو به یک رشته تخصیص بدیم به این صورت: string ilmaz3= ilmaz2;
بعد نوشتن کد مذکور با خطای زیبای Cannot implicitly convert type ‘object’ to ‘string’. An explicit conversion exists (are you missing a cast?)
مواجه میشید!!! بزرگوار میگه شما نمیتونید به صورت ضمنی Less Derived به More Derived تبدیل کنید و البته میدونم که الان دارید میگید کاری نداره به صورت explicit تبدیل میکنیم و تامام: string ilmaz3= (string) ilmaz2;
درسته این روش کار میده اما وقتی type از این قبیل انتخاب میکنیم به سیستم میگیم که نوع Object واقعا یک رشته است و اینجا یه سوال مهم پیش میاد اگر واقعا رشته نباشه چی؟
object value1 = new object(); string value2 = (string) value1;
با اجرای کد فوق کنار هزینه ای که ایجاد کردیم یک خطای قشنگ هم در runtime میگیریم که میگه چه شده؟؟؟!!!
نتیجه اخلاقی که از خطاها میگیریم اینه که به این شکل More Derived رو نمیشه به Less Derived تخصیص داد ولی برعکس آن چرا و همچنین نوع تخصیص و نوع اختصاص داده شده باید یکسان باشه به این معنی که هیچ تغییری بین نوع Child یا More Derived و نوع Parent یا Less Derived وجود نداره. به این فیچر به اختصار Invariance گفته می شود.
ادامه دارد…
بیشتر درباره جمله ” نوع تخصیص و نوع اختصاص داده شده باید یکسان باشه” توضیح میدی ؟
به این معنی که طرف “بعد ” مساوی با طرف “قبل ” مساوی باید از نگاه Type (x=y;) یا نوعی که دارن می بایست یکسان باشه مثلا رشته میتونه به یک نوع string تخصیص داده بشه و یا میتونه به object تخصیص داده بشه به این دلیل که رشته خودش فرزند object هست و در سطوح انتزاعی جنسش یکی هست یعنی typeof(object).IsAssignableFrom(typeof(string)) خروجی True بر می گرداند.
باز اگر گنگ بود بفرما موضوع رو بیشتر باز کنم.