Przeciążenie operatorów

0
public static implicit operator double(Fraction f)
    {
        return (double)f.num / f.den;
    }

Mógłby ktoś pomóc mi zrozumieć tę linijkę?
Mam obiekt klasy Fraction, i tak konwertuję go na double. Ale dlaczego double występuje tutaj na miejscu operatora?
Rozumiem, że funkcja zwraca double, ale po co tam jest to słowo kluczowe "operator"?
Trochę się w tym zamotałem...

Jakby ktoś chciał spojrzeć, to cały kod wygląda tak:

using System;

class Fraction
{
    int num, den;

    public Fraction(int num, int den)
    {
        this.num = num;
        this.den = den;
    }

    public static Fraction operator +(Fraction a, Fraction b)
    {
        return new Fraction(a.num * b.den + a.den * b.num, a.den * b.den);
    }

    public static Fraction operator *(Fraction a, Fraction b)
    {
        return new Fraction(a.num * b.num, a.den * b.den);
    }

    public static implicit operator double(Fraction f)
    {
        return (double)f.num / f.den;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Fraction a = new Fraction(3, 4);
        Fraction b = new Fraction(7, 8);
        Fraction c = a + b;

        Console.WriteLine((double)a);
        Console.WriteLine((double)c);
        Console.ReadKey();

    }
} 
0

implicit to konstrukcja pozwalająca na zrobienie konwersji (automatycznej) pomiędzy typami. Wygląda to mniej więcej tak: implicit operator <typ na który konwertujemy>(<typ konwertowany="konwertowany">).

Tutaj robiony jest operator konwersji pomiędzy typem Fraction, a typem double. Dzięki czemu można dalej w kodzie zrobić coś takiego jak Console.WriteLine((double)c); (zrzutować Fraction na double - i to przejdzie).

http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

0

Nie robiłbym w tym przypadku operatora implicit, ponieważ konwersja ułamka zwykłego na double jest operacją potencjalnie stratną.
Prawidłowo konwersja powinna być zrobiona jako operator explicit.

0
Azarien napisał(a):

Nie robiłbym w tym przypadku operatora implicit, ponieważ konwersja ułamka zwykłego na double jest operacją potencjalnie stratną.
Prawidłowo konwersja powinna być zrobiona jako operator explicit.

Dlaczego? Jeśli ktoś w ogóle korzysta z double, to musi się liczyć ze stratami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1