Laden...

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

Erstellt von Xqgene vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.314 Views
X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 19 Jahren
was haltet ihr von mehrfachen und von covarianten return types in C#?
1.549 Beiträge seit 2004
vor 19 Jahren

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

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 19 Jahren

ich meine eigentlich beide sachen. also covariant return types und mehrere rückgabe werte.

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.

333 Beiträge seit 2004
vor 19 Jahren

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})

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 19 Jahren

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 🙂 )

333 Beiträge seit 2004
vor 19 Jahren

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})

M
456 Beiträge seit 2004
vor 19 Jahren

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.

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 19 Jahren

@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.

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.

F
124 Beiträge seit 2004
vor 19 Jahren

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!

M
456 Beiträge seit 2004
vor 19 Jahren

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.

T
81 Beiträge seit 2004
vor 19 Jahren

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 .. _