Gdy ten kawałek kodu, Equation(10, 20)
jest wysyłany do konsoli:Wsparcie Boolean ale nadal mają wyświetlacz WriteLine użyciu ToString
public class Equation
{
public int a;
public int b;
public override string ToString()
{ return "Equation(" + a + ", " + b + ")"; }
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new Equation() { a = 10, b = 20 });
Console.ReadLine();
}
}
Chciałbym wesprzeć Equation
instancje wykorzystywany w teście if
więc pozwolił na niejawna konwersja do Boolean
:
public class Equation
{
public int a;
public int b;
public override string ToString()
{ return "Equation(" + a + ", " + b + ")"; }
public static implicit operator Boolean(Equation eq)
{ return eq.a == eq.b; }
}
class Program
{
static void Main(string[] args)
{
if (new Equation() { a = 10, b = 10 })
Console.WriteLine("equal");
Console.WriteLine(new Equation() { a = 10, b = 20 });
Console.ReadLine();
}
}
jednak problem jest, teraz, gdy używam WriteLine
na Equation
, to get przeliczone t o a Boolean
zamiast drukowania przy użyciu ToString
.
Jak mogę zezwolić na niejawną konwersję na Boolean
i nadal mam wyświetlanie WriteLine
przy użyciu ToString
?
aktualizacja
To pytanie jest inspirowana przez klasę Equation
w SymbolicC++. Poniższy kod ilustruje, że Equation
mogą być wyświetlane poprzez cout
jak również wykorzystane w teście na if
:
auto eq = x == y;
cout << eq << endl;
if (eq)
cout << "equal" << endl;
else
cout << "not equal" << endl;
Więc to jakoś możliwe w C++.
Wow, zabiłeś to Mike. Dzięki! – dharmatech
Podczas gdy "Równania" działają w wyliczeniach, które wymieniłeś, wygląda na to, że nie działają z operatorami '||' i '&&'. Pomyślałem, że wspomnę o tym ludziom, którzy rozważają tę opcję. – dharmatech
@dharmatech Jak już powiedziałem, nie można go już przekształcić w 'Boolean'. Moglibyśmy przeciążyć także operatory '&' i '|', ale byłoby to ograniczone, ponieważ nadal nie moglibyśmy zrobić czegoś takiego jak 'eq && true'. Zgadzam się z komentarzem Jona, że tego typu rzeczy są trochę zbyt sprytne i mogą być mylące zarówno dla konsumentów twojego kodu, jak i przyszłych opiekunów. –