Переопределить возвращаемое значение объектов
Я пытаюсь сравнить объект со значением int, например
if (myObject - 5 == 0)
doSomething();
мой класс может выглядеть примерно так: (большинство сеттеров/геттеров удалены, поэтому не против, чтобы все переменные были частными)
public class SomeClass
{
public string name;
private int minValue;
private int maxValue;
private int currValue;
public int getCurrentValue()
{
return currValue;
}
}
То, что я пытаюсь достичь, выглядит примерно так:
someClassInstance - 5;
чтобы быть равным
someClassInstance.getCurrentValue() - 5;
Могу ли я сделать переопределение для того, чтобы объект действовал как int (его собственная переменная), противоположный простому объекту?
Ответы
Ответ 1
Может ли быть оператор?
public class SomeClass {
...
public static int operator -(SomeClass left, int right) {
if (Object.ReferenceEquals(null, left))
throw new ArgumentNullException("left");
return left.getCurrentValue() - right;
}
}
...
SomeClass someClassInstance = new SomeClass(...);
int result = someClassInstance - 5;
Другая возможность (на основе неявного оператора) заключается в том, чтобы преобразовать SomeClass неявно в int
при необходимости:
public class SomeClass {
...
// Whenever int is requiered, but SomeClass exists make a conversion
public static implicit operator int(SomeClass value) {
if (Object.ReferenceEquals(null, value))
throw new ArgumentNullException("value");
return value.getCurrentValue();
}
}
...
SomeClass someClassInstance = new SomeClass(...);
int result = someClassInstance - 5;
Ответ 2
На самом деле вам было бы намного лучше переопределить operator int
, таким образом вы можете делать гораздо больше вычислений с меньшими перегрузками:
using System;
namespace Demo
{
public class SomeClass
{
public string name;
private int minValue;
private int maxValue;
public int currValue;
public int getCurrentValue()
{
return currValue;
}
public static implicit operator int(SomeClass value)
{
if (value == null)
throw new ArgumentNullException("value");
return value.currValue;
}
}
internal class Program
{
private void run()
{
var test = new SomeClass {currValue = 5};
if (test - 5 == 0)
Console.WriteLine("It worked");
if (test + 5 == 10)
Console.WriteLine("This also worked");
}
private static void Main()
{
new Program().run();
}
}
}
Ответ 3
Вы можете поэкспериментировать со смесью неявных преобразований и перегрузка оператора, но по моему опыту вы никогда не будете работать так плавно, как хотите (и, как вы могли бы заставить его работать на С++).
Если бы я был вами, я бы изменил getCurrentValue на свойство:
public int CurrentValue
{
get {return currValue};
}
и просто используйте someClassInstance.CurrentValue -5