همانطور که در پست قبل مشاهده کردید ما یه نگاه اجمالی به موضوع Variance داشتیم و در این پست میخوایم سراغ فیچر دیگه به اسم Invariance بریم اما قبل از شروع بهتره به عنوان یادآوری به تعریف دو کلمه More Derived و  Less Derived یه نگاهی بندازیم:

  1. More Derived : به Subclass یا کلاس فرزند به اصطلاح More Derived میگیم.
  2. 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 گفته می شود.

 

ادامه دارد…

 

دسته بندی شده در: