2017-12-05 5 views
0

Ich habe die Klasse Wichtig und einige Objekte dieser Klasse erstellt. Ich möchte erlauben Benutzer Hauptobjekt dieser Klasse wählen. Sehen Sie sich den folgenden Code an:C# Statische Eigenschaft in nicht-statischen Klasse als Indikator des Hauptobjekts dieser Klasse

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Important imp1 = new Important("Important 1"); 
     Important imp2 = new Important("Important 2"); 
     Important imp3 = new Important("Important 3"); 

     imp2.SetMostImportant(); 

     Console.Write(Important.MostImportant.Name); 
    } 

    public class Important 
    { 
     public Important(string name) 
     { 
      Name = name; 
      if(MostImportant == null) 
       SetMostImportant(); 
     } 

     public string Name { get; private set; } 
     public static Important MostImportant { get; private set; } 

     public void SetMostImportant() 
     { 
      MostImportant = this; 
     } 
    } 
} 

Ist es eine gute Lösung? Wenn nicht, bitte sag mir warum nicht.

Bevor, um diese Art von Dingen zu erreichen, habe ich gerade boolean Feld namens z. IsMainObject und, wenn ich Hauptobjekt ändern wollte, ich durch alle Objekte (oder Gruppe von Objekten) einer bestimmten Klasse iteriert mit Ausnahme Element, dass ich Haupt sein möchte, und änderte booleschen Wert in false, in meinem neuen Kandidat Ich setze einfach Flag auf wahr . Beispiel unten:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Important imp1 = new Important("Important 1"); 
     Important imp2 = new Important("Important 2"); 
     Important imp3 = new Important("Important 3"); 
     List<Important> list = new List<Important> { imp1, imp2, imp3 }; 

     foreach(var item in list.Where(x => x.Name != "Important 2")) 
     { 
      item.SetMostImportant(false); 
     } 

     imp2.SetMostImportant(true); 
     Console.Write(list.FirstOrDefault(x => x.MostImportant == true).Name); 
    } 

    public class Important 
    { 
     public Important(string name) 
     { 
      Name = name; 
     } 

     public string Name { get; private set; } 
     public bool MostImportant { get; private set; } 

     public void SetMostImportant(bool val) 
     { 
      MostImportant = val; 
     } 
    } 
} 

ich da nicht diese Lösung mag:

  1. Ich weiß nicht, ob MostImportant für mehr als ein Objekt ohne Iterieren wahr ist.
  2. Ich muss Extra-Code schreiben, um viel mehr Fälle zu behandeln.
  3. Ich habe keine Möglichkeit, immer alle Instanzen einer bestimmten Klasse durchlaufen (Gruppen sind nicht immer genug).

... und vieles mehr, aber Sie haben die Idee.

+0

Es gibt wirklich keine Möglichkeit zu beurteilen, ob es gut oder schlecht ist, ohne Kontext des Geschäfts oder technischen Problems, das Sie versuchen zu lösen. Erreicht der Code das, was er erreichen soll? Dann ist es zumindest gut genug für diesen Verdienst allein. Kann es verbessert werden? Wahrscheinlich ja, aber es hängt davon ab, die Frage zu beantworten, in welchem ​​Aspekt zu verbessern? Dies würde aufgrund mangelnder Spezifizität in der Frage auch breiten auf die Meinung der Öffentlichkeit bezogenen Antworten unterliegen. – LB2

Antwort

1
public static Important MostImportant { get; private set; } 

ist eine feine Lösung, und viel besser als

public bool MostImportant { get; private set; } 

Es ist nicht ungewöhnlich, dass eine statische Eigenschaft des Typs zu haben, die es innerhalb der ist, wenn „Singletons“ Klassen implementieren. Ich habe einen ähnlichen Code geschrieben:

class MyClass 
{ 
    public static MyClass Instance { get; private set; } 
    public MyClass() 
    { 
     if (Instance == null) 
     { 
      Instance = this; 
     } 
     else 
     { 
      throw new Exception("MyClass already instantiated."); 
     } 
    } 
} 
Verwandte Themen