/// </summary>
/// <param name='w1'></param>
/// <param name='w2'></param>
/// <returns></returns>
public static Wheels operator + (Wheels w1, Wheels w2) {
w1.wheel += w2.wheel; return w1;
}
/// <summary>
/// предоставляет альтернативную функциональность сложения.
/// отметим, что вторая альтернатива операции сложения
/// находится не в этой структуре, а в классе car
/// </summary>
/// <param name= 'w'></param>
/// <returns></returns>
public Wheels AddWeels(Wheels w) {
this.wheel += w.wheel;
return this;
}
/// <summary>
/// поэтому целые литералы можно неявно преобразовать в wheel
/// </summary>
/// <param name='x'></param>
/// <returns></returns>
public static implicit operator Wheels(int x) {
return new Wheels(x);
}
}
Здесь выделим использование метода AddWheel()
, что удовлетворяет рекомендациям об альтернативных сигнатурах. Язык CLS, который не поддерживает перезагрузку операторов, может получить доступ к той же функциональности сложения с помощью этого метода. Фрагмент кода ниже показывает, как может использоваться этот тип данных значения:
public static void Main(String[] args) {
Wheels front = 2; // неявное преобразование
Wheels back = 4; // неявное преобразование
Wheels total = front + back; // перезагруженная версия сложения
Console.WriteLine(total);
}
Компиляция и выполнение этого кода дадут в результате 6. Можно также изменить тип Car
, чтобы разрешить сложение и вычитание из него Wheels
. Следующий код показывает изменения, сделанные в классе Car
:
public class Car {
int wheels, doors, headlights;
public Car(int wheels, int doors, int headlights) {
this.wheels = wheels;
this.doors = doors;
this.headlights = headlights;
}
public Car AddWheel(Two.Wheels w) {
this.wheels += w.Number;
return this;
}
internal int Wheels {
set {
wheels = value;
}
get {
return wheels;
}
}
/// <summary>
/// выполняет операцию сложения на Wheel и Car
/// </summary>
/// <param name='c1'>car</param>
/// <param name='w1'>wheel</param>
/// <returns></returns>
public static Car operator +(Car c1, Wheels w1) {
c1.Wheels += w1.Number;
return c1;
}
/// <summary>
/// выполняет операцию вычитания на Wheel и Car
/// </summary>
/// <param name='c1'>car</param>
/// <param name='w1'>wheel</param>
/// <returns></returns>
public static Car operator -(Car c1, Wheels w1) {
c1.Wheels -= w1.Number;
return c1;
}
public override string ToString() {
return
'[wheels = ' + wheels + '| doors = ' + doors + '|'
+ ' headlights = ' + headlights + ']';
}
}
В класс Car
также был добавлен метод AddWheel
. Представленный далее фрагмент кода проверяет функциональность, только что добавленную в Car
:
public static void Main(String[] args) {
Wheels front = 2;
Wheels back = 4;
Wheels total = front + back;