Verwendung neuerer C#-Funktionen, nämlich out var
können Sie die statische Factory-Methode loswerden. Ich habe gerade herausgefunden (durch Zufall), dass aus var-Parameter von Methoden aufgerufen inse base-"Aufruf" Fluss an den Konstruktor Körper.
Beispiel mit dieser Basisklasse, von der Sie ableiten wollen:
public abstract class BaseClass
{
protected BaseClass(int a, int b, int c)
{
}
}
Der nicht kompilierte Pseudocode, den Sie ausführen möchten:
public class DerivedClass : BaseClass
{
private readonly object fatData;
public DerivedClass(int m)
{
var fd = new { A = 1 * m, B = 2 * m, C = 3 * m };
base(fd.A, fd.B, fd.C); // base-constructor call
this.fatData = fd;
}
}
Und die Lösung durch die Verwendung einer statischen privaten Helper-Methode, die alle erforderlichen Basisargumente (plus zusätzliche Daten, falls erforderlich) und ohne Verwendung einer statischen Factory-Methode, nur einfach Konstruktor nach außen:
public class DerivedClass : BaseClass
{
private readonly object fatData;
public DerivedClass(int m)
: base(PrepareBaseParameters(m, out var b, out var c, out var fatData), b, c)
{
this.fatData = fatData;
Console.WriteLine(new { b, c, fatData }.ToString());
}
private static int PrepareBaseParameters(int m, out int b, out int c, out object fatData)
{
var fd = new { A = 1 * m, B = 2 * m, C = 3 * m };
(b, c, fatData) = (fd.B, fd.C, fd); // Tuples not required but nice to use
return fd.A;
}
}
37 Stimmen
Es ist auch erwähnenswert, dass Sie Konstruktoren in Ihrer aktuellen Klasse verketten können, indem Sie
this
parabase
.0 Stimmen
Sie ist hier docs.microsoft.com/de-us/dotnet/csharp/language-reference/
5 Stimmen
Anstatt zu sagen, "es fällt alles auseinander", ist es viel hilfreicher, einfach die Fehlermeldung zu posten, die Sie erhalten
0 Stimmen
Try: public class MyExceptionClass : Exception { public MyExceptionClass(string message, string extrainfo) : base(message) { //andere Dinge hier } }
0 Stimmen
@Quibblesome Ich habe kein Beispiel gefunden, in dem .this durch .base ersetzt wurde. Wahrscheinlich habe ich mich nicht richtig ausgedrückt, aber haben Sie irgendwelche Beispiele? Meine Frage ist, wenn Sie die Ersetzung vornehmen, brauchen Sie dann nicht mehr :base in den Argumenten und können einfach .base im Konstruktor verwenden?