2016-05-15 16 views
0

Ich möchte eine Klassenmethode haben, die die vorhandene Elementvariable ändert und den geänderten Wert festlegt.Klassenmethode zum Ändern und Festlegen der Klassenelementvariable

Beispiel:

public class Animal 
{ 
    public string color { get; set; } 

    public string getColor 
    { 
     get 
     { 
      return color; 
     } 
    } 

    public string convertColor 
    { 
     set 
     { 
      this.color = this.colorConversion(); 
     } 
    } 

    public string colorConversion() 
    { 
     string number = this.getColor; 
     switch (number) 
     { 
      case "0": 
       return "Lighter"; 
      case "1": 
       return "Good!"; 
      case "2": 
       return "Darker"; 
      default: 
       return "Fix this somehow!"; 
     } 
    } 

} 

Also, wenn ich das Objekt instanziiert, würde ich nur eine Zeile verwenden, muß die Umwandlung

Wie zu tun:

Animal cow = new Animal(); 
cow.convertColor; 

Anstatt haben mehr Zeilen wie:

Animal cow = new Animal(); 
string currentColor = cow.getColor; 
cow.setColor = cow.colorConversion(currentColor); 

Bitte helfen Sie mir zu verstehen, wenn es möglich ist.

+1

Die Methoden 'getColor' und' setColor' sind nicht notwendig - die Eigenschaft 'color' selbst hat bereits einen Getter und Setter. Außerdem ist das Ignorieren des gegebenen "Wertes" in einem Property Setter ... nicht das, was andere Programmierer erwarten würden. Ist eine Schnur wirklich der richtige Typ hier? '" Friday "' ist eine gültige Zeichenkette, aber es ist keine gültige Farbe ... Wie auch immer, warum muss 'Animal' von numerischen Zeichenketten in Farbnamen konvertiert werden - und welche Art von Beziehung besteht zwischen diesen Zahlen und Farbnamen ? –

+0

Hoppla, danke, dass du sie eingefangen hast! :-) Der String-Typ ist, weil ich den String-Rückgabewert (einer Zahl) von einem API bekomme und ich es in einen String in einem anderen Format konvertieren muss. – wsgb

Antwort

1

Zunächst einmal nur ein tieren oder das andere:

public string color { get; set; } 

ODER

public string getColor 
     { 
      get 
      { 
       return color; 
      } 
     } 

Sie mischen zwei Dinge hier hat man Unveränderlichkeit getColor und der andere hat Wandelbarkeit color Sie müssen also entscheiden, ob der Endbenutzer die Eigenschaft get oder get and set der Eigenschaft haben soll.

Zweitens wollen Sie die Farbe konvertieren, wenn Sie die Klasse instanziiert .... Das ist seltsam, denn wenn man die Klasse instanziiert, color eine leere Zeichenfolge sein und haben keine Farbe.

Drittens, wenn Sie den Konstruktor verwenden, um eine Klasse neu zu erstellen und die Farbe in - wie so new Animal("blue") - dann warum konvertieren Sie es, wenn Sie von der Eigenschaft erhalten, denn jetzt verdunkeln Sie die Funktion dieser Eigenschaft bis zum Ende Benutzer. Dies folgt nicht dem Prinzip des geringsten Erstaunens.

Also was Sie tun könnten, ist die Konvertierung weg von der Klasse abstrahieren, um es offensichtlicher zu machen.

class AnimalColorConverter 
{ 
    public void ConvertColor(Animal animal) 
    { 
     animal.color = colorConversion(animal.color); 
    } 

    private string colorConversion(input) 
    { 
     switch (input) 
     { 
      case "0": 
       return "Lighter"; 
      case "1": 
       return "Good!"; 
      case "2": 
       return "Darker"; 
      default: 
       return "Fix this somehow!"; 
     } 
    } 
} 

Dann würde Ihre Linien werden:

var converter = new AnimalColorConverter(); 
var animal = new Animal(); 
animal.color = "1"; 
converter.ConvertColor(animal); 

Was Sie müssen auch prüfen, ist der Kürze halber nicht immer eine gute Sache ist, wenn Sie zu diesem Motto in 6 Monate Zeit zurückkommen, werden Sie verstehen, was es tut?

Endlich, wenn ich nicht verstanden habe, was deine Klasse zu tun versucht und es nicht perfekt beantwortet habe - das liegt daran, dass ich aus deinem Code nicht verstehen kann, was du erreichen willst, was auf die 6 Monate zurückgeht Problem. Wenn Sie Code schreiben, sollten Sie üben, Dinge genau zu benennen, was sie tun, und wenn der Name zu lang ist, versucht es zu viel zu tun (Trennung von Teilen der SOLID-Prinzipien).

Also von meinem Code habe ich eine Klasse AnimalColorConverter, die fast in Bezug auf die Beschreibung der Funktion dieser Klasse ist. Dann habe ich eine Methode namens ConvertColor, die auch ziemlich genau beschreibt, was diese Funktion tut. Ich könnte sie besser benennen, wenn ich wüsste, was "0" in Ihrer switch Erklärung darstellt.Ich nehme an, dass "Lighter" eine Klasse der Farbe ist. So hätte ich meine Funktion ColorGrader genannt und dann würde ich erwarten, dass die Farbe der Farbe herauskommt.

+0

Super, danke !!! – wsgb

Verwandte Themen