我知道=
运算符不能重载,但必须有办法在我这里做我想要的:
我只是创建表示定量单位的类,因为我正在做一些物理学。显然我不能只从一个原语继承,但我希望我的类的行为与原语完全一样 - 我只是想让它们以不同的方式输入。
所以我可以去,
Velocity ms = 0;
ms = 17.4;
ms += 9.8;
等
我不知道该怎么做。我想我会写一些像这样的类:
class Power
{
private Double Value { get; set; }
//operator overloads for +, -, /, *, =, etc
}
但显然我不能重载赋值运算符。有什么办法可以解决这个问题吗?
答案 0 :(得分:82)
听起来你应该使用 struct 而不是类...然后创建一个隐式转换运算符,以及各种运算符来添加等。
以下是一些示例代码:
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;
}
}
(作为旁注......我不明白这是如何真正代表速度的,因为当然需要方向和幅度。)
答案 1 :(得分:10)
您可以创建隐式转换运算符。有一个page on MSDN有一个很好的例子。
使它们成为不可变的结构也是一个好主意。这正是“基元”的含义,而这就是不可能继承它们的原因。您需要一个结构,因为您需要值类型语义,而不是引用类型语义。并且您希望它们不可变,因为可变值类型通常是bad idea.
答案 2 :(得分:-9)
我认为它不能被重载,因为C#类都是从Object派生的,所以它们基本上是对象,当你使用赋值运算符时,你基本上只是引用另一个对象。另一方面,如果您使用结构,那么您基本上需要所有信息,因此当您使用=运算符时,将复制所有字段。
所以我会说,面对它,并实现一个名为Copy()的函数,你应该没问题: - )