از این پست میخوایم مروری بر مباحث Covariance و Contravariance داشته باشیم و بعد از اون به کمی مفهومی تر در حوزه OOP بپردازیم پس یه چای بریزید و آماده بشید برای یه عالمه مباحث جذاب!

ابتدا با یه موضوع سبک برای گرم شدن شروع می کنیم و بعد کم کم کمی مباحث رو عمیق تر میکنیم پس بریم برای یه مفهوم با نام Variance!!!

همانطور که می دونید در زبان های Object-Oriented هماننده C# و JAVA می تونیم یک transition بین نوع های مرتبط داشته باشیم مثلا در سی شارپ هر Type از کلاس Object ارث می بره به همین دلیل ما می تونیم String رو به Integer در داخل یه Object Type تعریف کنیم و باز به همین دلیل Object Type را میتونیم به String تبدیل کنیم:

struct MyStruct1 {}
class MyChildClass {}

//Usage
Console.WriteLine("MyStruct1 is a struct? {0}", typeof (ValueType)
  .IsAssignableFrom(typeof (MyStruct1))); // True
Console.WriteLine("MyStruct1 is a object? {0}", typeof (object)
  .IsAssignableFrom(typeof (MyStruct1))); // True

Console.WriteLine("MyChildClass is a struct? {0}", typeof (ValueType)
  .IsAssignableFrom(typeof (MyChildClass))); // False
Console.WriteLine("MyChildClass is a object? {0}", typeof (object)
  .IsAssignableFrom(typeof (MyChildClass))); // True

 

 

فرض کنیم یه تعریفی به شکل زیر داریم:

در کد بالا MyStruct1 از  System.ValueType و MyChildClass از MyBaseClass و MyBaseClass از Class ارث بری می کند و همچنین Class و System.ValueType هردو از Object Class ارث بری می کنند. به این صورت ما میتونیم transition یا change بین این دو داشته باشیم.

به این فیچر به اصطلاح Variance گفته میشود.

به طور خللاصه Variance یک تغییر مابین Type هاست.

 

ادامه دارد…

 

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