از این پست میخوایم مروری بر مباحث 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 هاست.
ادامه دارد…
خیلی خوب بود. دستت درد نکنه 🍁🥰
ممنون🤞