Перегрузка оператора присваивания в С#
Я знаю, что оператор =
не может быть перегружен, но должен быть способ сделать то, что я хочу здесь:
Я просто создаю классы для представления количественных единиц, так как я занимаюсь немного физикой. По-видимому, я не могу просто наследовать от примитива, но я хочу, чтобы мои классы вели себя как примитивы - я просто хочу, чтобы они набрали по-другому.
Итак, я мог бы пойти,
Velocity ms = 0;
ms = 17.4;
ms += 9.8;
и др.
Я не уверен, как это сделать. Я решил, что просто напишу несколько таких классов:
class Power
{
private Double Value { get; set; }
//operator overloads for +, -, /, *, =, etc
}
Но, видимо, я не могу перегрузить оператор присваивания. Есть ли способ получить это поведение?
Ответы
Ответ 1
Похоже, вы должны использовать структуру, а не класс..., а затем создать неявный оператор преобразования, а также различные операторы для добавления и т.д.
Вот пример кода:
public struct Velocity
{
private readonly double value;
public Velocity(double value)
{
this.value = value;
}
public static implicit operator Velocity(double value)
{
return new Velocity(value);
}
public static Velocity operator +(Velocity first, Velocity second)
{
return new Velocity(first.value + second.value);
}
public static Velocity operator -(Velocity first, Velocity second)
{
return new Velocity(first.value - second.value);
}
// TODO: Overload == and !=, implement IEquatable<T>, override
// Equals(object), GetHashCode and ToStrin
}
class Test
{
static void Main()
{
Velocity ms = 0;
ms = 17.4;
// The statement below will perform a conversion of 9.8 to Velocity,
// then call +(Velocity, Velocity)
ms += 9.8;
}
}
(В качестве побочной заметки... Я не вижу, как это действительно представляет скорость, так как это, безусловно, требует как направления, так и величины).
Ответ 2
Вы можете создавать неявные операторы преобразования. Хороший пример: страница в MSDN.
Это также хорошая идея сделать их неизменяемыми структурами. Именно это и есть "примитивы", и то, что делает невозможным унаследовать их. Вам нужна структура, потому что вы хотите семантику типа значения, а не семантику ссылочного типа. И вы хотите, чтобы они были неизменными, потому что изменяемые типы значений обычно представляют собой плохую идею.
Ответ 3
Я думаю, что он не может быть перегружен, потому что все классы С# производны от Object, поэтому они являются в основном объектами, и когда вы используете операторы присваивания, вы в основном просто ссылаетесь на другой объект. С другой стороны, если вы используете структуру, то вам в основном нужна вся информация, поэтому, когда вы используете оператор =, все поля будут скопированы.
Итак, я бы сказал, посмотри на него и реализуй функцию Copy(), и вы должны быть в порядке: -)