Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
was haltet ihr von mehrfachen und von covarianten return types in C#?
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

Themenstarter:

was haltet ihr von mehrfachen und von covarianten return types in C#?

beantworten | zitieren | melden

http://www.c-plusplus.de/forum/viewtopic.php?t=96808
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
S.H.-Teichhof
myCSharp.de - Member

Avatar #avatar-2460.jpg


Dabei seit:
Beiträge: 1.549
Herkunft: Sindringen

beantworten | zitieren | melden

ich ferstehe nicht ganz zu was du unsere meinung haben wilst vieleicht kanst du ja deine frage noch genauer stellen und wenn du das zu den Mehreren rückgabewerten meinst ich schreibe für so was eigendlich einfach eine klasse die alle rückgabewerte aufnimmt die ich dan übergeben kann
Wir Arbeiten eigendlich nicht wir nehmen nur das geld
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

Themenstarter:

beantworten | zitieren | melden

ich meine eigentlich beide sachen. also covariant return types und mehrere rückgabe werte.
Zitat
ich schreibe für so was eigendlich einfach eine klasse die alle rückgabewerte aufnimmt die ich dan übergeben kann

genau struktur oder klasse schreiben. die wird vielleicht nur ein einziges mal verwendet und nie wieder.
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
NoOneKnows
myCSharp.de - Member

Avatar #avatar-1526.gif


Dabei seit:
Beiträge: 333
Herkunft: Hannover

beantworten | zitieren | melden

Das mit den kovarianten Rückgabetypen kann unter Umständen durchaus nützlich sein, aber auf biegen und brechen brauch mans nicht. Da sind Generics, Nullable Types, Edit and Continue, usw. allesamt viel wichtiger.

Das mit dem mehreren Rückgabewerten ist reine Spielerei. Entweder du verwendest eine Klasse/Struktur, wie Teichhof sagt, als Rückgabewert oder benutzt das out-Schlüßelwort, dann brauchst du auch keinen zusätzlichen Typ definieren.
([bb]|[^b]{2})
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

Themenstarter:

beantworten | zitieren | melden

ob das nur spielereien sind, ist 'ne ansichtssahe. ich würde gerne so was schon nutzen.

wenn man z.B. Generics/Templates nicht kennt kann die beim ersten mal auch als überflüssig/unverständlich/etc. betrachten. aber wenn man damit ne weile gearbeitet hat, lernt sie zu schätzen. so ist es mit vielen neuen dingen. (sieh mal das Telefon )
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
NoOneKnows
myCSharp.de - Member

Avatar #avatar-1526.gif


Dabei seit:
Beiträge: 333
Herkunft: Hannover

beantworten | zitieren | melden

Generische Typen mit der Rückgabe mehrerer Werte zu vergleichen halte ich für etwas sehr gewagt Das eine ist erheblich wichtiger als das andere. Und auserdem kannst du doch mehrere Werte mit out zurückgeben. Wo ist denn da das Problem? Jetzt sag nich, das sieht blöd aus *g*
([bb]|[^b]{2})
private Nachricht | Beiträge des Benutzers
maxE
myCSharp.de - Member



Dabei seit:
Beiträge: 456
Herkunft: Sachsen

beantworten | zitieren | melden

Seltsam covariant return types scheinen bei MS schon zu funktionieren.
Ist euch schon mal folgendes aufgefallen:

Geht mal in eure Frameworkdokumentation und schaut euch mal Hashtable an.
Hashtable implementiert IDictionary mit der Methode

IDictionaryEnumerator GetEnumerator();
und IEnumerable mit der Methode

 IEnumerator GetEnumerator();

Wie haben die das bloß gemacht? Zwei gleiche Methoden, bloß mit unterschiedlichem Rückgabewert. Ich dachte das geht laut Artikel (noch) nicht?
Hat jemand ne Erklärung?
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

Themenstarter:

beantworten | zitieren | melden

@NoOneKnows: Das war auch kein Vergleich, ich wollte nur damit sagen, dass man einige neue Dinge am Anfang als überflüssig, unnötig oder Spielereien abstempelt, und welche nach einer Weile nicht mehr wegzudenken sind.
Zitat
Jetzt sag nich, das sieht blöd aus *g*
du hast es voll erwischt!


@maxE: Habe ich auch schon ein paar Mal gesehen. Aufgefallen ist mir das bei einigen Collection. Die implementieren IList-Interface, wo Indexer (object this[] {get; set;}) von Typ object ist, haben selbst aber einen anderen Rückgabe-Typ.
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
Fabse
myCSharp.de - Member



Dabei seit:
Beiträge: 124

beantworten | zitieren | melden

ich glaube das geht auch in usercode!

erstellt euch mal 2 interfaces, die die gleiche methode mit unterschiedlichen rückgabetypen fordern.

jetzt erstellt ne klasse, die von beiden erben soll.


interface ITest1
{
double getData();
}
interface ITest2
{
bool getData();
}
class Test : ITest1, ITest2
{
#region ITest1 Member

public double getData()
{
// TODO: Implementierung von Test.getData hinzufügen
return 0;
}

#endregion

#region ITest2 Member

bool LogikTester.ITest2.getData()
{
// TODO: Implementierung von Test.LogikTester.ITest2.getData hinzufügen
return false;
}

#endregion
}

tada!
private Nachricht | Beiträge des Benutzers
maxE
myCSharp.de - Member



Dabei seit:
Beiträge: 456
Herkunft: Sachsen

beantworten | zitieren | melden

Ah, mit Namensraumangabe geht es also.
Ich muss dann aber beim Zugriff explizit casten um an die richtige Methode ran zu kommen. Also so:


bool b = ((ITest2)t).getData();
double d = ((ITest1)t).getData();

Zum Artikel, der im C++ Forum gepostet wird:
Kann man das nicht so lösen:
(Habe die Klassen übernommen und nur etwas erweitert um die Verwendung etwas deutlicher zu machen)

using System;
 
 namespace Test
 {
 	public class AClass { public AClass(string _s){ s = _s; } public string s; }
 	public class BClass : AClass { public BClass(string _s):base(_s){} }
 	
 	public interface IBase
 	{
 		AClass GetStuff();
 	}
 	
 	public interface IDerived : IBase
 	{
 		new BClass GetStuff();
 	}
 	
 	public class Base : IBase {
 		public AClass GetStuff() {
 			return new AClass( "Hallo von A in Base" );
 		}
 	}
 	
 	public class Derived : IDerived {
		AClass IBase.GetStuff() {
 			return new AClass( "Hallo von A in Derived" );
 		}
 		BClass IDerived.GetStuff() {
 			return new BClass( "Hallo von B in Derived" );
 		}
 	}
 	
 	class MainClass
 	{
 		public static void Main(string[] args)
 		{
 			Base b = new Base();
 			Derived d = new Derived();
 			
 			AClass a1 = b.GetStuff();
			AClass a2 = ((IBase)d).GetStuff();
			BClass b1 = ((IDerived)d).GetStuff();
 			
 			Console.WriteLine("{0}  {1}  {2}", a1.s, a2.s, b1.s );
 		}
 	}
 }

Mit dem Schlüsselwort new in IDerived kann man doch die Methode überdecken und dann mit einem Cast wieder "hervorholen".
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
private Nachricht | Beiträge des Benutzers
Tankian
myCSharp.de - Member



Dabei seit:
Beiträge: 81

beantworten | zitieren | melden

Fänd ich irgendwie nicht so toll, wenn das im nächsten Standard mitaufgenommen wird. Wie eh bereits im blog kommentiert wurde, kann man das eh ganz gut mit expliziter Interface Implementierung hinkriegen.

Mehrere Rückgabewerte hatte ich auch schon in C++ mit boost::tuple zur Verfügung, nur wie gesagt wirkt es trotzdem wie ne bloße Spielerei. Fände es schade, wenn C# wegen solchen Dingen seine Einfachheit verliert ..

Btw. hat man soweit ich weiß covariant return types in C++ nicht zur Verfügung (wollte nur die Aussage im blog korrigieren). Es gibt zwar keinen Compilerfehler, wenn man ein ganz bestimmtes Kriterium einhält, arbeitet aber trotzdem genau so, als hätte man es in gewohnter Weise gemacht ..
private Nachricht | Beiträge des Benutzers