سربارگذاری تبدیل ها

تبدیل‌ها را در سی شارپ می‌توان سربارگذاری کرد. به عنوان مثال، برای تبدیل یک کلاس به یک کلاس غیر مرتبط دیگر، می‌توان از سربارگذاری تبدیل‌ها (صریح و ضمنی) استفاده کرد. مثال زیر نشان می‌دهد که چطور می‌توان عملگرهای تبدیل را سربارگذاری کرد.

   1: using System;
   2: 
   3: class Animal
   4: {
   5:     public int Height { get; set; }
   6: 
   7:     public static implicit operator Plant(Animal animal)
   8:     {
   9:         Plant result = new Plant();
  10:         result.Height = animal.Height;
  11:         return result;
  12:     }
  13: }
  14: 
  15: class Plant
  16: {
  17:     public int Height { get; set; }
  18: 
  19:     public static explicit operator Animal(Plant plant)
  20:     {
  21:         Animal result = new Animal();
  22:         result.Height = plant.Height;
  23:         return result;
  24:     }
  25: }
  26: 
  27: class Program
  28: {
  29:     public static void Main()
  30:     {
  31:         Animal myAnimal = new Animal();
  32:         myAnimal.Height = 100;
  33: 
  34:         //Implicit conversion 
  35:         Plant myPlant = myAnimal;
  36: 
  37:         Console.WriteLine("myAnimal.Height = {0}cm", myAnimal.Height);
  38:         Console.WriteLine("myPlant.Height = {0}cm", myPlant.Height);
  39: 
  40:         myPlant.Height = 200;
  41: 
  42:         //Explicit conversion
  43:         myAnimal = (Animal)myPlant;
  44: 
  45:         Console.WriteLine("nmyAnimal.Height = {0}cm", myAnimal.Height);
  46:         Console.WriteLine("myPlant.Height = {0}cm", myPlant.Height);
  47:     }
  48: }
myAnimal.Height = 100cm
myPlant.Height = 100cm

myAnimal.Height = 200cm
myPlant.Height = 200cm

در مثال بالا مشاهده می‌کنید که دو کلاس Animal و Planet هیچ کدام از دیگری ارث بری نمی‌کنند و درنتیجه هیچ ارتباطی به هم ندارند. برای هر کلاس یک سربارگذاری تبدیل هم تعریف کرده‌ایم. کلاس Animal تبدیل ضمنی خود به کلاس Plant را سربارگذاری می‌کند. به این نکته توجه کنید که برای مشخص کردن اینکه تبدیل ضمنی است یا صریح، به ترتیب از کلمه کلیدی implicit و explicit استفاده کرده‌ایم، و کلمه کلیدی operator نشان دهنده این است که متد برای سربارگذاری مورد استفاده قرار می‌گیرد.

نام کلاس مقصد را می‌نویسیم. وقتی یک شیء از Animal را به یک شیء Plant اختصاص می‌دهیم کد داخل متد سربارگذاری شده اجرا می‌شود. متد یک پارامتر دارد که ارجاع به نمونه کلاسی است که باید تبدیل شود. این متد همچنین، نه دارای نوع برگشتی هست و نه نام، در ضمن باید به صورت public و static تعریف شود.

در داخل متد، یک نمونه از کلاس Animal را ساخته و مقدار خاصیت Height شیء Plant ارسالی به متد را به خاصیت Height شیء نسبت می‌دهیم. اساساً، شما باید کدهای لازم برای انتقال مقادیر لازم از شیء مبدأ به شیء مقصد را بنویسید. در متد دوم، از کلمه کلیدی explicit به جای implicit استفاده کرده‌ایم. این کلمه نشان دهنده تبدیل صریح است. دستور زبان نوشتن این تبدیل شبیه به تبدیل قبلی است با این تفاوت که به جای کلمه کلیدی implicit از explicit استفاده کنید. در داخل این متد از کدهای مشابهی برای سربارگذاری استفاده کرده‌ایم. به تبدیل ضمنی کلاس Animal به Plant توجه فرمایید :

Plant myPlant = myAnimal;

نمی‌توانیم مکان قرارگیری آنها را بر عکس نماییم :

Animal myAnimal = myPlant;

چون که متدی برای تبدیل ضمنی کلاس Plant به Animal تعریف نشده است. اما چون برای تبدیل صریح متدی را تعریف کرده‌ایم می‌توانیم کد را به شکل زیر تغییر دهیم :

Animal myAnimal = (Animal)myPlant;

برای انجام تبدیل صریح از casting استفاده کرده‌ایم.