Program.cs 2.98 KB
Newer Older
Uwe Wienkop's avatar
Uwe Wienkop committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;

namespace _01OperatorTrueFalse
{
    public struct LaunchStatus
    {
        public static readonly LaunchStatus Green = new LaunchStatus(0);
        public static readonly LaunchStatus Yellow = new LaunchStatus(1);
        public static readonly LaunchStatus Red = new LaunchStatus(2);

        private int status;

        private LaunchStatus(int status)
        {
            this.status = status;
        }

        public static bool operator true(LaunchStatus x) => x == Green || x == Yellow;
        public static bool operator false(LaunchStatus x) => x == Red;

        public static LaunchStatus operator &(LaunchStatus x, LaunchStatus y)
        {
            if (x == Red || y == Red || (x == Yellow && y == Yellow))
            {
                return Red;
            }

            if (x == Yellow || y == Yellow)
            {
                return Yellow;
            }

            return Green;
        }

        public static bool operator ==(LaunchStatus x, LaunchStatus y) => x.status == y.status;
        public static bool operator !=(LaunchStatus x, LaunchStatus y) => !(x == y);

        public override bool Equals(object obj) => obj is LaunchStatus other && this == other;
Uwe Wienkop's avatar
Uwe Wienkop committed
40
41
        // Equals testet, ob ein hier: Launchstatus-Obj. gleich einem anderen OBJEKT ist
        // Dies setzt gleiche Typen und gleiche Inhalte voraus!
Uwe Wienkop's avatar
Uwe Wienkop committed
42
43
44
45
46
47
48
49
50
51
52
53
        public override int GetHashCode() => status;
    }

    public class LaunchStatusTest
    {
        public static void Main()
        {
            // Wichtig! Die nächste Zeile zeigt die Short-Cut-Evaluation durch das Überladen von 
            // true und false! Es erfolgt jeweils eine implizite Wandlung nach bool durch die 
            // Überladung von true und false. Daher wird GetNavigationLaunchStatus nur aufgerufen, 
            // wenn GetFuelLauchStatus gleich true ist!
            LaunchStatus okToLaunch1 = GetFuelLaunchStatus() && GetNavigationLaunchStatus();
Uwe Wienkop's avatar
Uwe Wienkop committed
54
55
56
            // GetFuelLauchStatus() --> LaunchStatus ---(op true)--> bool
            // Wenn true --> GetNavigationLaunchStatus() --> LaunschStatus ---(op true)--> bool
            // GetFuelLaunchStatus() & GetNavigationLaunchStatus(); --- Einfaches &
Uwe Wienkop's avatar
Uwe Wienkop committed
57
58
59
60
61
            Console.WriteLine("----------------");
            LaunchStatus okToLaunch2 = GetFuelLaunchStatus() & GetNavigationLaunchStatus();
            // Nochmals: Durch das überladene true ist der nachfolgende Ausdruck zulässig!
            Console.WriteLine("----------------");
            Console.WriteLine(okToLaunch1 ? "Ready to go!" : "Wait!");
Uwe Wienkop's avatar
Uwe Wienkop committed
62
63
            // okToLaunch1 ---(op true)--> bool
            //if (okToLaunch1.Equals(okToLaunch2))
Uwe Wienkop's avatar
Uwe Wienkop committed
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
        }

        static LaunchStatus GetFuelLaunchStatus()
        {
            Console.WriteLine("Getting fuel launch status...");
            return LaunchStatus.Red;
        }

        static LaunchStatus GetNavigationLaunchStatus()
        {
            Console.WriteLine("Getting navigation launch status...");
            return LaunchStatus.Yellow;
        }
    }
}