Autor Beitrag
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 16.04.13 01:52 
Moin,

es ist ja durchaus möglich, durch explizite und implizite Überladung eines Typs zu erreichen, eine explizite und implizite Konvertierung zu erreichen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
class GefäßKlasse<T>
{
    public T objekt;
    public static implicit operator T(GefäßKlasse<T> obj)
    {
        return obj.objekt;
    }
}

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
class Program
{
    static void Main()
    {
        GefäßKlasse<int> obj = new GefäßKlasse<int>() { objekt = 5 };
        int zahl = obj;
    }
}


Ich möchte das auch anders herum erreichen, dass ich das Objekt einer Klasse wie einen Wert mit einem primitiven Datentyp aufrufen kann und der übergebene neue Wert, wird intern im Objekt dann automatisch einer vor definierten Eigenschaft zu gewiesen. Gleichzeitig soll aber auf weitere Eigenschaften zugegriffen werden können.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
class GefäßKlasse<T>
{
    public T objekt;
    public int IrgendeineZahl;
    // Hier müsste irgendetwas hin
}

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
class Program
{
    static void Main()
    {
        GefäßKlasse<int> obj = new GefäßKlasse<int>() { objekt = 5 };
        obj = 10;
        Console.WriteLine(obj); // Ausgabe: 10
        obj.IrgendeineZahl = 20;
        Console.WriteLine(obj.IrgendeineZahl); // Ausgabe: 20
    }
}


Das ganze möchte ich aber nicht nur für primitive Datentypen verwenden, sondern für jeden, den es gibt.
Damit erreiche ich, dass ich einem Attribut einer Klasse spezifische Eigenschaften zuweisen kann, ohne dabei den Aufruf dieses Attributes zu ändern, also dass man es genauso verwenden, als wäre es unverändert. Wenn ich nun aber auf diese spezifischen Informationen zugreifen möchte, rufe ich direkt eine der Eigenschaften ab und arbeite damit.
Oder man kann über ein Event von außen fest legen, wie eine Eigenschaft reagiert, ohne dass ich dafür reihenweise Events für jedes Attribut anlegen muss, ich könnte dann einfach das entsprechende Event in dem Attribut suchen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
class GefäßKlasse<T>
{
    public delegate void ObjektÄndertSichEventHandler(T sender);

    private T _Obj;
    public T Obj
    {
        get { return this._Obj; }
        set
        {
            ObjektÄndertSichEvent(value);
            this._Obj = value;
        }
    }
    public event ObjektÄndertSichEventHandler ObjektÄndertSichEvent;

    // Hier müsste irgendetwas hin
}

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
class KlasseMitVielenAttributen
{
    public GefäßKlasse<string> name;
    // ...
}

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
class Program
{
    static void Main()
    {
        var obj = new KlasseMitVielenAttributen();
        obj.name = "Heinz"// Hier wird das Objekt vom Typ GefäßKlasse<string> wie vom Typ string behandelt
        obj.name.ObjektÄndertSichEvent += NameÄndertSich;
    }

    public static void NameÄndertSich(string sender)
    {
        Console.WriteLine("Neuer Name: " + sender);
    }
}


An sich wäre das ja machbar, indem ich eine Klasse schreibe, die von dem jeweils benötigten Typ erbt, aber dann ist das nur für diesen Typ von Bedeutung, ich möchte das aber generisch haben.

An sich möchte ich also in einer Klasse fest legen können, welche Eigenschaft dieser Klasse verwendet wird, wenn keine Eigenschaft direkt angesprochen wird. Normalerweise würe das einen Fehler geben, aber kann man das auch gewollt steuern?


Gibt es da eine Möglichkeit, das irgendwie einzurichten, oder ist dafür vielleicht sogar schon etwas vor gesehen?


Grüße
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 16.04.13 17:01 
Hallo Palladin007,

s.a. Overloading assignment operator in C#, so daß du dann implizite Operatoren anbieten würdest (nur eben in die andere Richtung).
Ob dies auch bei Klassen funktioniert, weiß ich (jetzt aus dem Kopf) nicht. Aber bedenke, daß Strukturen eben Wertetypen sind, d.h. es wird immer das ganze Objekt bei der Zuweisung kopiert.

Aber m.E. wäre bei deinem Fall eine Eigenschaft (bzw. Methode) besser (evtl. ja sogar generisch).
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 16.04.13 20:02 
Ich möchte ja keinen Wertetyp daraus machen, sondern eine Klasse verwenden.
So wollte ich z.B. das Event, dass sich etwas Ändert, direkt an die Eigenschaft binden, ohne dafür etwas in der Klasse, in der die Eigenschaften liegen, schreiben zu müssen.

Ich könnte das zwar mit der impliciden Überladung des Typs dieser kleinen Klasse regeln, aber damit würde ich dann ein neues Objekt bekommen, weil diese Überladungen statisch sind. :/


Eine Eigenschaft würde ich ja gerne daher vermeiden, weil ich das Attribut, an das ich so weitere Daten binden möchte, genauso aufrufen und verwenden will, wie es auch ohne diese Daten möglich wäre. Machbar wäre natürlich, wenn ich in der Klasse, in der ich das alles einbaue, dann in einer Eigenschaft die entsprechende Eigenschaft des privaten Attributs zurück gebe oder neu setze, aber dann kann ich darüber nicht auf diese weiteren Daten zugreifen, die ich ja an das Attribut binden wollte.

Oder ist es möglich, Eigenschaften zu überladen, also dass es der gleiche Name, aber ein anderer Rückgabety ist?
Logischer Weise ist der Typ, der das eigentliche Attribut in sich und die dazu gehörigen Daten bindet, nicht gleich dem gebundenen Typ, wenn also zwei Eigenschaften mit gleichen Namen, aber diesen beiden Typen da sind, wäre das ein Umweg. Nicht so, wie ich es mir erhofft hatte, aber es würde nach außen hin zumindest so aussehen.

Bei mir funktioniert es zumindest nicht. Muss ich da die Java-Typischen Get-Set-Methoden als Umweg verwenden?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 16.04.13 20:46 
Zitat:
Oder ist es möglich, Eigenschaften zu überladen, also dass es der gleiche Name, aber ein anderer Rückgabety ist?


Rückgabetypen sind beim überladen nie beteiligt. Du kannst ja auch keine Methoden haben die sich nur im Rückgabetypen unterscheiden. Ein Umweg über getter Methoden geht also auch nicht die müssten sich auch in der Signatur ohne Rückgabetyp unterscheiden (übrigens garantiert auch in Java).

Wie sollte auch entschieden werden welche Methode bei einem Aufruf wie obj.Property.Methode() benutzt werden soll wenn der Property Typ nicht schon eindeutig ist?
Databinding wäre übrigens ein ziemlich lustiges Minenfeld ;)
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 16.04.13 20:59 
Ach verdammt, das hab ich nicht beachtet. -.-

Zitat:
Databinding wäre übrigens ein ziemlich lustiges Minenfeld


Wie meinst du das?
Das mit dem Minenfeld klingt schon irgendwie logisch, aber warum weiß ich grad nicht xD
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 16.04.13 21:22 
Weil Databinding über die Namen der Properties funktioniert (Halt Reflection auf die Property). Wenn das nicht eindeutig ist regiert der Zufall.