2017-06-11 6 views
1

Ich habe einige Bedingungen in meinem Konstruktor. Wenn der Parameter diese Bedingungen nicht erfüllt, möchte ich stattdessen einen anderen überladenen Konstruktor verwenden. Ist das möglich?Kann man innerhalb eines Konstruktors zu einem anderen Konstruktor wechseln?

Beispielcode:

public Header(byte[] givenData, Utilities.FileType defaultingFileType) 
{ 
    int index = -1; 
    if (givenData != null) 
    { 
     // possibly alter int index here 
    } 
    if (index != -1) 
    { 
     // found match, parse givenData 
    } 
    else 
    { 
     // no suitable match found, default to given file type 
     this = Header(defaultingFileType); 
    } 
    // etc. 
} 

Die Linie:

this = Header(defaultingFileType); 

ist mein unmöglicher Versuch zu einem anderen Konstruktor zu ändern. Wie würde ich an dieser Stelle zu einem anderen Konstruktor wechseln? Wenn ich nicht zu einem anderen Konstruktor wechseln kann, muss ich den Code des anderen Konstruktors an dieser Stelle in diesen Konstruktor kopieren/einfügen. Der Konstruktor Ich mag würde stattdessen an dieser Stelle verwenden ist:

public Header(Utilities.FileType givenFileType){} 
+0

nein. Nächste Frage bitte. –

+0

Ist das eine Klasse oder Struktur? Structs können dies zuweisen, aber Klassen nicht. –

+0

@mikez Dies ist eine Klasse. – Sparky

Antwort

2

Sie können nicht von einem anderen Konstruktor Konstruktor aufrufen, aber Sie können eine dieser Lösung verwenden: 1. statische Methode erstellen und ausführen Konstruktor:

public class Class1 
{ 
public Class1() 
{ 
} 
public Class1(param1) 
{ 
} 
public Class1(param1,param2) 
{ 
} 
public Class1(param1,param2,param3) 
{ 
} 
public static Class1 GetNew(param1,param2,param3) 
{ 
    if(param1 != null && param2!= null && param3!= null) 
    { 
    return new Class1(param1,param2,param3); 
    } 
    else if(param1 != null && param2!= null && param3== null) 
    { 
    return new Class1(param1,param2); 
    } 
    else if(param1 != null && param2 == null && param3== null) 
    { 
    return new Class1(param1); 
    } 
    else 
    { 
    return new Class1(); 
    } 

} 
} 

2-Nutzung ein Constructor und Methoden erstellen:

public class Class2 
{ 
public Class1(param1,param2,param3) 
{ 
    if(param1 != null && param2!= null && param3!= null) 
    { 
    Method1(param1,param2,param3); 
    } 
    else if(param1 != null && param2!= null && param3== null) 
    { 
    Method1(param1,param2); 
    } 
    else if(param1 != null && param2 == null && param3== null) 
    { 
    Method1(param1); 
    } 
    else 
    { 
    Method1(); 
    } 
} 
public void Method1(param1,param2,param3) 
{ 
} 
public void Method1(param1,param2) 
{ 
} 
public void Method1(param1) 
{ 
} 
public void Method1() 
{ 
} 
} 
+0

Ich denke, der zweite Ansatz, und was die Kommentare empfohlen, ist das, was am besten zu meinem Codierungsansatz passt. Vielen Dank. – Sparky

1

Sie nicht an einen anderen Konstruktor aus dem Körper eines Konstruktor wechseln. Wenn dies etwas ist, das Sie benötigen, ist es am besten, entweder zu privaten Konstruktoren zu wechseln und eine statische Methode zu verwenden, um den Konstruktor aufzurufen oder ein Factory-Muster zu verwenden.

0

Wenn Sie nur Standardwerte verwenden möchten, können Sie Syntax wie das verwenden:

public Header(byte[] givenData, Utilities.FileType defaultingFileType = [DEFAULT_VALUE]) 
{ 
... 
} 

Diese nur von .NET 3.5 und der Standardwert arbeiten muss konstant sein.

Wenn Sie dies nicht ausreichend finden, denke ich, der beste Weg, dies zu lösen, ist statische Methode, die verwendet wird, um eine Instanz dieser Klasse zu erstellen. Sie können den Konstruktor sogar auf private setzen, wenn Sie eine unangemessene Verwendung der Klasse vermeiden möchten.

Darüber hinaus können Sie auch einige private Funktionen erstellen, die die Felder behandeln, um die sich die Bedingung dreht. Rufen Sie diese Funktion dann jedes Mal mit anderen Parametern auf.

+0

Zur Klarheit, wenn das 'byte [] dataData' ungültig ist, möchte ich das Objekt stattdessen mit dem 'defaultingFileType' konstruieren, das zur Verfügung gestellt wird, um zu sagen," wenn es nicht geklappt hat, benutze einfach den Standardkonstruktor mit diesem Wert stattdessen." Das ist 'Header (defaultingFileType)'. Ist es möglich, eine statische Methode zum Festlegen der Eigenschaften eines Objekts zu verwenden? – Sparky

Verwandte Themen