Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.09.2015, 12:17

C# Abstract Delegate

Hallo Ihr lieben,

ich habe noch eine essentielle Frage :D

Gibt es im gesamten .NET Framework irgend einen komplett abstrakten Delegaten?

Also ich weiß es gibt den "Delegate" aber ich meine ob man einen solchen auch für polymorphe Anwendung benutzen kann:

hier ein kleines Beispiel:

C#-Quelltext

1
2
3
4
public void DoWork(Delegate anyDelegate){   anyDelegate(); }
Main(){    Func<int, bool> predicate = x => (x + 5) != 10; // irgend ein quatsch Lambda Ausdruck..
       DoWork(predicate);  
}

Soweit ich weiß ist das in .NET nicht möglich, korrigiert mich wenn ich falsch liege.
das wäre doch auch nix anderes als ein void* Pointer oder nicht ?( ?(
Wie immer wäre ich euch über Profitipps sehr dankbar

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

01.09.2015, 12:32

Du kannst einfach den Lambdaausdrücke schachteln (und den Rückgabewert optional beachten (ungetesteter code):

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public TResult DoWork<TResult>(Func<TResult> anyDelegate)
{
   return anyDelegate(); 
}

Main()
{    
    Func<int, bool> predicate = x => (x + 5) != 10; // irgend ein quatsch Lambda Ausdruck..
    Action<int> predicate2 = x => {};
    
    //Mit Rückgabewert
    DoWork(() => predicate(10));
    DoWork(() => 
    {
        predicate2(10);
        return default(int));
    };
}


Ansonsten beschreibe deinen Anwendungsfall, dann finden wir da schon was ;).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

01.09.2015, 13:04

Ich wüsste spontan ehrlich gesagt gar nicht wofür man das brauchen sollte und wieso normale Delegates nicht reichen. Das Problem ist mir unklar.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

01.09.2015, 13:04

Mich würde der Anwendungsfall auch interessieren.

Ansonsten kannst du halt bei Func die Ko- und Kontravarianz der Typparameter nutzen: https://msdn.microsoft.com/en-us/library…(v=vs.110).aspx Abschnitt Generic Delegates with Variant Type Parameters

5

01.09.2015, 19:44

Oh das war nur ein generelles Anliegen von mir^^, ich habe da kein Spezialfall, aber das Prinzip ist doch den void* Zeigern aus C gleich, das ist doch dann so, als würde man fragen, wieso braucht man void* Zeiger, den man nach anderen Zeigersorten casten kann??

Prinzipiell könnte es doch irgend wann mal ganz sinnvoll sein, das kein Spezialfall einer Funktionssignatur gebraucht wird, sondern das jede Funktion ausgeführt werden kann?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

01.09.2015, 21:46

Oh das war nur ein generelles Anliegen von mir^^, ich habe da kein Spezialfall, aber das Prinzip ist doch den void* Zeigern aus C gleich, das ist doch dann so, als würde man fragen, wieso braucht man void* Zeiger, den man nach anderen Zeigersorten casten kann??

Die void* Zeiger nutzt man soweit ich weiß aber auch nur, weil es in C keine Generics gibt. Wenn man in einer streng typisierten Sprache die Typinformation wegschmeißen will, sollten alle Alarmsirenen losgehen.

Prinzipiell könnte es doch irgend wann mal ganz sinnvoll sein, das kein Spezialfall einer Funktionssignatur gebraucht wird, sondern das jede Funktion ausgeführt werden kann?

Wie rufst du denn eine Funktion auf die zuviele oder die falschen Parameter hat? Das klingt nach ziemlich hässlichen Laufzeitfehlern, die man ja eigentlich durch die Verwendung einer typisierte Sprache vermeiden möchte.

Für den Fall man gibt zu viele Parameter geht es übrigens mit anonymous functions:

Zitat von »https://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx«


There is one case in which an anonymous method provides functionality not found in lambda expressions. Anonymous methods enable you to omit the parameter list. This means that an anonymous method can be converted to delegates with a variety of signatures. This is not possible with lambda expressions.

Also eine parameterlose anonymous function kann in Delegates mit beliebigen Parametern eingesetzt werden.

7

01.09.2015, 23:12

@Tobiking

Tobi, du bist mein King :D :D :D

das meine ich :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

02.09.2015, 06:35

Aber wofür brauchst Du das? Das riecht nach einer schlechten Lösung für ein simples Problem.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

03.09.2015, 17:13

@BlueCobold

ich brauche das nicht wie gesagt, es war ein generelles Anliegen meinerseits ^^

Ist halt gut zu wissen das es geht, weil das ist ja quasi eine "Alles" Funktion bzw. erlaubt jegliche Funktion und der Delegate wird vom Compiler anhand des Bodys der Anonymen Funktion ja abgeleitet. (so wie ich das verstehe)

Und wie gesagt, manchmal kann man doch sagen, akzeptiere an diesem Codestück JEDE Funktion und nicht nur eine Funktion mit "int" als Input und "string" als Output.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

03.09.2015, 22:05

Macht aber wenig Sinn so eine Forderung zu treffen, bzw. klingt sehr unsicher. Wenn es nur darum geht mehr Input mitzugeben, sind Closures aus meiner Erfahrung ausreichend.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige