Autor Beitrag
boskop
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 12.11.08 16:36 
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

ausblenden 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#

ausblenden 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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:
ausblenden C#-Quelltext
1:
List<IMetaClass<T>> SubMetaClasses<T>() { return ...; }					


Zuletzt bearbeitet von Th69 am Do 13.11.08 15:05, insgesamt 1-mal bearbeitet
boskop Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 13.11.08 12:04 
Also das hier kompiliert bei mir problemlos:
ausblenden 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
    }

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
boskop Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 13.11.08 12:17 
Hä? :gruebel: T ist nicht bekannt. T ist ein generischer Parameter. T kann irgendeine Klasse sein.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 13.11.08 13:35 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Und auch generische Properties sind möglich:
Nein:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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.