Operador de atribuição de sobrecarga em C#
Eu sei que o Operador {[[2]} não pode ser sobrecarregado, mas deve haver uma maneira de fazer o que eu quero aqui:
Só estou a criar aulas para representar unidades quantitativas, já que estou a fazer um pouco de física. Aparentemente eu não posso apenas herdar de um primitivo, mas eu quero que minhas aulas se comportem exatamente como primitivos -- eu só quero que elas sejam digitadas de forma diferente. Então eu poderia ir.Velocity ms = 0;
ms = 17.4;
ms += 9.8;
Etc.
Não sei como fazer isto. Pensei em escrever umas aulas como então ...class Power
{
private Double Value { get; set; }
//operator overloads for +, -, /, *, =, etc
}
Mas aparentemente não posso sobrecarregar o operador da missão. Há alguma maneira de conseguir este comportamento?
3 answers
Parece que devias estar a usar uma struct em vez de uma classe... e, em seguida, criar um operador de conversão implícito, bem como vários operadores para adição, etc.
Aqui está um código de amostra: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;
}
}
(como uma nota lateral... Eu não vejo como isso realmente representa uma velocidade, como certamente isso precisa de uma direção, bem como uma magnitude.)
Pode criar operadores de conversão implícitos. Existe uma página em MSDN com um bom exemplo.
Também é boa ideia torná-los estruturas imutáveis. É exactamente isso que os" primitivos " são, e é isso que torna impossível herdar deles. Você quer uma estrutura porque você quer semântica de tipo de valor, em vez de semântica de tipo de referência. E você os quer imutáveis porque tipos de valor mutáveis são geralmente uma idéia ruim.Eu acho que não pode ser sobrecarregado porque as classes C# são todas derivadas de objetos, então eles são basicamente objetos, e quando você usa os operadores de atribuição, você está basicamente apenas referenciando outro objeto. Por outro lado, se você usar uma estrutura, então você basicamente precisa de toda a informação, então quando você usar = operador, todos os campos serão copiados.
Então eu diria, encare, e implemente uma função chamada Copy () e você deve estar bem: -)