static Hund MakeHund() { ...
Func<Tier> func = MakeHund();void Foo(Tier t) {...
Action<Hund> action = Foo;using System;
namespace Kovarianz_Kontravarianz
{
class Kovarianz
{
// Delegat für eine Methode die als Rückgabewert FooBase erwartet.
delegate FooBase Creator();
//---------------------------------------------------------------------
static void Main()
{
// Normale Verwendung des Delegaten:
Creator fooBaseCreator = CreateFooBase;
// Verwendung des Delegaten mit Kovarianz:
// Der tatsächliche Rückgabetyp der Methode Foo erbt vom Typen
// FooBase den der Delegat erwartet. Somit gilt:
// Typ: Foo -> FooBase
// Rückgabetyp: Foo -> FooBase
// Beide Vererbungsrichtungen sind in die selbe Richtung und
// somit kovariant.
Creator fooCreator = CreateFoo;
// Aufrufen der Delegaten:
FooBase object1 = fooBaseCreator();
FooBase object2 = fooCreator();
// Kontrollausgabe um zu sehen welche Typen erzeugt wurden:
Console.WriteLine(object1.GetType().Name);
Console.WriteLine(object2.GetType().Name);
Console.ReadKey();
}
//---------------------------------------------------------------------
// Erzeugt eine Basisklasse.
static FooBase CreateFooBase() { return new FooBase(); }
//---------------------------------------------------------------------
// Erzeugt einen von der Basisklasse abgeleiteten Typ.
static Foo CreateFoo() { return new Foo(); }
}
//-------------------------------------------------------------------------
class FooBase { }
//-------------------------------------------------------------------------
class Foo : FooBase { }
}
using System;
namespace Kovarianz_Kontravarianz
{
class Kovarianz
{
// Delegat für eine Methode mit einem Argument vom Typ FooBase.
delegate void DoSomethingWithFooBase(FooBase o);
// Delegat für eine Methode mit einem Argument vom Typ Foo.
delegate void DoSomethingWithFoo(Foo o);
//---------------------------------------------------------------------
static void Main()
{
// Normale Verwendung des Delegaten:
DoSomethingWithFooBase printTypeOfFooBase = PrintType;
// Verwendung des Delegaten mit Kontravarianz:
// Der von der Methode erwartete Typ des Arguments ist FooBase
// und der vom Delegaten deklarierte Typ ist Foo welcher von FooBase
// erbt. Somit gilt:
// Typ: Foo -> FooBase
// Argument-Typ: FooBase <- Foo
DoSomethingWithFoo printTypeOfFoo = PrintType;
// Aufrufen der Delegaten:
printTypeOfFooBase(new FooBase());
//printTypeOfFooBase(new Foo()); // ist auch möglich
printTypeOfFoo(new Foo());
Console.ReadKey();
}
//---------------------------------------------------------------------
// Gibt des Typ.
static void PrintType(FooBase o)
{
Console.WriteLine(o.GetType().Name);
}
}
//-------------------------------------------------------------------------
class FooBase { }
//-------------------------------------------------------------------------
class Foo : FooBase { }
}
| 1 |
Wow! Danke.
– Mammal 06.08.09
|
| 1 |
Danke für die Blumen. Werde aber nicht jede Frage so ausführlich beantworten können ;)
Hier fand ich es angebracht um das Verständnisproblem zu lösen. – gfoidl 08.08.09
|