Entwickler-Ecke

Basistechnologien - Generische Properties


boskop - Mi 12.11.08 16:36
Titel: Generische Properties
Hallo liebe C# cracks.

Ich komme aus der Java-Ecke und versuche etwas nachzubauen. Jetzt gibt es ja in c# die Properties.
Dazu hätte ich 2 Fragen.

1. Wie streng benutzt man die? Also ich definiere gerade Interfaces. Benutzt ihr da die Properties oder arbeitet ihr mit getter und setter?
Weil wenn ich in einem Interface folgendes habe:

# JAVA


Quelltext
1:
2:
3:
Foo getFoo();
Foo getFoo(String name);
Foo getFoo(String name, Object.. params);


Wenn ich das in c# so mache... sieht das ja etwas doof aus:

# C#


C#-Quelltext
1:
2:
3:
Foo Foo { get; }
Foo GetFoo(String name);
Foo GetFoo(String name, params Object[] params);


Man kann jetzt sagen, dass es sich dann bei Foo wohl nicht um ein Property im eigentlichen Sinne handelt... aber das weiss man ja jetzt noch nicht zwingend.

Dann mal zu Frage 2:

Gibt es generische Properties? Also sowas:


C#-Quelltext
1:
List<IMetaClass<T>> SubMetaClasses { get; }                    


Ich habe wohl alle möglichen Syntaxvarianten ausprobiert, aber immer wird vom Compiler gemotzt. Ohne Properties würde ich das ja so schreiben:


C#-Quelltext
1:
List<IMetaClass<T>> GetSubMetaClasses<T>();                    


Danke schon jetzt für die Einstiegshilfe :-)

Boskop

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Th69 - Mi 12.11.08 17:30

Properties sollten in C# immer dann benutzt werden, wenn sie als Zugriff auf eine Membervariable zu verstehen sind (und meistens auch so einfach implementiert sind).
Getter-Methoden ohne Parameter sollten m.E. dann garnicht benutzt werden, außer evtl. in deinem Fall wo es Überladungen gibt, so daß dann einfacher zu verstehen ist, daß Foo() quasi ein Äquivalent zu einer anderen Foo(...)-Methode aber mit Standard-Parametern ist.

-------------------------------------------
Unsinn gelöscht:
Zitat:

Und auch generische Properties sind möglich:

C#-Quelltext
1:
List<IMetaClass<T>> SubMetaClasses<T> { return ...; }                    

Jedoch mußt du dann selber die Definition vornehmen, da der Compiler ja nicht weiß, welche Membervariablen er ansonsten anlegen soll...
(Ich benutze z.Z noch .NET 2.0, daher ist das nur eine Vermutung von mir...)


Edit:
Stimmt, was Kha schreibt: generische Properties gibt es nicht, nur normale Properties bei generischen Klassen...

Also noch mal neu formuliert als Methode:

C#-Quelltext
1:
List<IMetaClass<T>> SubMetaClasses<T>() { return ...; }                    


boskop - Do 13.11.08 09:21

Danke für deine Antwort. Also ich denke, es ist besser, wenn man demnach kein Property verwendet, wenn man den getter überlädt. So sieht man beim Entwickeln (Code Completion) eher die anderen Varianten.

Beim generischen Property geht das hier leider nicht:

IMetaClass<K> SuperMetaClass<K> { get; }

Ich arbeite mit .Net 3.0 und meine deklaration ist in einem Interface.

Gruss

Boskop


Christian S. - Do 13.11.08 12:04

Also das hier kompiliert bei mir problemlos:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
    interface IMetaClass<K>
    {
        void DoFoo(K blah);
    }

    interface IFoo<T>
    {
        IMetaClass<T> SuperMetaClass { get; }
    }

    class Foo<M> : IFoo<M>
    {
        #region IFoo<M> Members

        public IMetaClass<M> SuperMetaClass
        {
            get { throw new NotImplementedException(); }
        }

        #endregion
    }


boskop - Do 13.11.08 12:12

Ja diese Variante compiliert bei mir auch, aber was ist, wenn du
IMetaClass<K> zurückgeben willst. Also nicht weisst, welchen Typ K hat. Du hast T benutzt und die Klasse ist schon vom Typ T, also ist T bekannt. Aber bei mir ist das K noch nicht bekannt.

In Java würde ich das so machen:

IMetaClass<?> getSuperMetaClass();

Gruss


Christian S. - Do 13.11.08 12:17

Hä? :gruebel: T ist nicht bekannt. T ist ein generischer Parameter. T kann irgendeine Klasse sein.


Kha - Do 13.11.08 13:35

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Und auch generische Properties sind möglich:
Nein:

Quelltext
1:
2:
property-declaration:
  attributes(opt) property-modifiers(opt) type member-name { accessor-declarations }

Nur Klassen und Methoden dürfen eigene Typparameter besitzen.
user profile iconboskop hat folgendes geschrieben Zum zitierten Posting springen:
Also nicht weisst, welchen Typ K hat. Du hast T benutzt und die Klasse ist schon vom Typ T, also ist T bekannt. Aber bei mir ist das K noch nicht bekannt.
Wenn du ein Real-World-Beispiel hast, können wir uns gern darüber streiten, ob generische Properties Sinn machen oder nicht :zwinker: . Mir fallen da gerade nur Factories ein, für die benutzt man aber auch unter .Net normalerweise Methoden.


boskop - Do 13.11.08 14:10

Vielen Dank, das war jetzt mal eine klare Antwort: es geht nicht :-)

Wir befinden uns hier mit den Properties eh etwas in einem Philosophie-Streit. Ich denke Properties machen wirklich nur Sinn, wenn es eben echt ein Property der Klasse ist. Ein Auto hat ein Rad, einen Motor, ... Aber wenn für den Benzienverbrauch pro 100km würde ich jetzt eher eine Methode schreiben. Andere bei uns im Geschäft wollen immer wenn es einen getter ohne argumente hat ein Property verwenden.

Wir sind gerade dabei in Java-Framework nach c# zu portieren... das gibt ziemlich Arbeit.