Wie kann ich Reflektion oder Alternative verwenden, um Funktionsaufrufe programmatisch zu erstellen?

8

Ich bin ein bisschen Anfänger mit Reflection. Ich hoffe, dass es möglich ist, das zu tun, was ich möchte. Ich habe durch ProjectEuler gearbeitet, um die Sprache zu lernen, und ich habe eine Basisklasse namens Problem. Jedes einzelne PE-Problem ist eine separate Klasse, d. H. Problem16. Um meine Berechnungen auszuführen, verwende ich den folgenden Code:

%Vor%

Ich habe jetzt 50 Probleme gelöst, und ich möchte eine Schleife erstellen, um sie alle auszuführen. Meine Basisklasse Problem hat eine Methode, die an eine Textdatei die Problemnummer, die Antwort und die Ausführungszeit anfügt, die im Standardkonstruktor jeder Klasse aufgerufen wird. Ich könnte den Funktionsaufruf für alle 50 manuell ändern, aber wenn ich weiterhin Probleme beende, wird dies am Ende eine Menge Arbeit sein.

Ich würde es lieber programmatisch machen. Ich habe gehofft, dass dieser Pseudocode Wirklichkeit wird:

%Vor%     
wmaynard 21.12.2012, 17:28
quelle

5 Antworten

10

mit Reflexionen können Sie viel schönere Dinge tun.

deklarieren Sie beispielsweise eine Schnittstelle

%Vor%

Schreiben Sie Ihre Klassen, die von IEulerProblem abgeleitet sind.

Dann können Sie alles innerhalb (technisch) einer netten Codezeile ausführen:

%Vor%     
user287107 21.12.2012, 17:36
quelle
1

Sehen Sie sich zuerst alle geerbten Klassen einer abstrakten Klasse an , die auch für nicht abstrakte Klassen gelten.

Dann können Sie einfach die Methode für jede Basisklasse aufrufen.

%Vor%     
Erik Philips 21.12.2012 17:34
quelle
0

Ja, das ist möglich. Lesen Sie dazu MethodInfo.Invoke: Ссылка

    
mletterle 21.12.2012 17:34
quelle
0
%Vor%     
Austin Salonen 21.12.2012 17:35
quelle
0

Als eine der möglichen Lösungen möchte ich vorschlagen, eine Liste von Konstruktordelegaten ohne Reflektion zu erstellen.
Sie müssen die Liste immer noch 50 Mal füllen, aber nur einmal. Sie haben jedoch Typsicherheit und können für jede der abgeleiteten Klassen verschiedene Konstruktoren angeben. Etwas wie das:

%Vor%     
RAS 21.12.2012 18:29
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '363642',
    'url' => 'how-can-i-use-reflection-or-alternative-to-create-function-calls-programatically',
];

$_SESSION = [
    '__flash' => [],
];