Перегрузка операций преобразования типов

Последнее обновление: 12.08.2018
Упражнение 1

Дан класс Clock, который хранит количество часов:

class Clock
{
	public int Hours { get; set; }
}

В программе мы можем из числа получить количество часов и, наоборот, из количество часов значение типа int:

Clock clock = new Clock();
int val = 34;
clock.Hours = val % 24;
val = clock.Hours;

Добавьте в класс Clock оператор для неявного преобразования от типа int к типу Clock, и оператор явного преобразования от типа Clock к типу int.

Возможно определение класса:

class Clock
{
	public int Hours { get; set; }

	public static implicit operator Clock(int x)
	{
        return new Clock { Hours = x % 24 };
	}
	public static explicit operator int(Clock clock)
	{
		return clock.Hours;
	}
}

Применение:

Clock clock = new Clock { Hours = 15 };

int x = (int)clock;
Console.WriteLine(x);   // 15

Clock clock2 = 13;
Console.WriteLine(clock2.Hours);
clock2 = 34;
Console.WriteLine(clock2.Hours);
Упражнение 2

Даны следующие классы:

class Celcius
{
	public double Gradus { get; set; }
}
class Fahrenheit
{
	public double Gradus { get; set; }
}

Класс Celcius представляет градусник по Цельсию, а Fahrenheit - градусник по Фаренгейту.

Определите операторы преобразования от типа Celcius и наоборот.

Преобразование температуры по шкале Фаренгейта (Tf) в температуру по шкале Цельсия (Tc): Tc = 5/9 * (Tf - 32).

Преобразование температуры по шкале Цельсия в температуру по шкале Фаренгейта: Tf = 9/5 * Tc + 32.

Возможное решение:

class Celcius
{
	public double Gradus { get; set; }

	public static implicit operator Fahrenheit(Celcius celcius)
	{
		return new Fahrenheit { Gradus = 9.0 / 5 * celcius.Gradus + 32 };
	}
	public static implicit operator Celcius(Fahrenheit fahrenheit)
	{
		return new Celcius { Gradus = 5.0  / 9 * (fahrenheit.Gradus - 32) };
	}
}
class Fahrenheit
{
	public double Gradus { get; set; }
}

Применение:

Celcius celcius = new Celcius { Gradus = 25 };
Fahrenheit fahrenheit = celcius;
Console.WriteLine(fahrenheit.Gradus);
celcius = fahrenheit;
Console.WriteLine(celcius.Gradus);
Упражнение 3

Даны следующие классы:

class Dollar
{
	public decimal Sum { get; set; }
}
class Euro
{
	public decimal Sum { get; set; }
}

Класс Dollar представляет сумму в долларах, а Euro - сумму в евро.

Определите операторы преобразования от типа Dollar в Euro и наоборот. Допустим, 1 евро стоит 1,14 долларов. При этом один оператор должен подразумевать явное, и один - неявное преобразование.

Возможное решение:

class Dollar
{
	public decimal Sum { get; set; }
}
class Euro
{
	public decimal Sum { get; set; }
	public static explicit operator Dollar(Euro euro)
	{
		return new Dollar { Sum = euro.Sum * 1.14M };
	}
	public static implicit operator Euro(Dollar dollars)
	{
		return new Euro { Sum = dollars.Sum / 1.14M };
	}
}
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850