Frage

Der folgende Code besteht aus zwei Klassen :

  • Smart (einfaches Modell Klasse)
  • Smart (Plural-Klasse, die eine Sammlung von Smart Objekte enthält)

Ich möchte in der Lage, sowohl Singular und Plural Klassen zu instanziiert wie folgt: (das heißt ich will nicht eine Factory-Methode GetSmartForm ()):

SmartForms smartForms = new SmartForms("all");
SmartForm smartForm = new SmartForm("id = 34");

Logik zu konsolidieren, nur die Plural-Klasse sollte die Datenbank zugreifen . Die einzigartige Klasse, wenn sich instanziiert gefragt, wird einfach eine Pluralklasse instanziiert, dann die eine Sammlung des Objekts aus dem die Mehrzahl Objekt auswählen und werden, dass das Objekt .

Wie kann ich das tun? Ich habe versucht, das Objekt zuweisen this die nicht funktioniert.

using System.Collections.Generic;

namespace TestFactory234
{
    public class Program
    {
        static void Main(string[] args)
        {
            SmartForms smartForms = new SmartForms("all");
            SmartForm smartForm = new SmartForm("id = 34");
        }
    }

    public class SmartForm
    {
        private string _loadCode;

        public string IdCode { get; set; }
        public string Title { get; set; }

        public SmartForm() {}

        public SmartForm(string loadCode)
        {
            _loadCode = loadCode;
            SmartForms smartForms = new SmartForms(_loadCode);
            //this = smartForms.Collection[0]; //PSEUDO-CODE
        }

    }

    public class SmartForms
    {
        private string _loadCode;

        public List<SmartForm> _collection = new List<SmartForm>();
        public List<SmartForm> Collection
        {
            get
            {
                return _collection;
            }
        }

        public SmartForms(string loadCode)
        {
            _loadCode = loadCode;
            Load();
        }

        //fills internal collection from data source, based on "load code"
        private void Load()
        {
            switch (_loadCode)
            {
                case "all":
                    SmartForm smartFormA = new SmartForm { IdCode = "customerMain", Title = "Customer Main" };
                    SmartForm smartFormB = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    SmartForm smartFormC = new SmartForm { IdCode = "customerMain3", Title = "Customer Main3" };
                    _collection.Add(smartFormA);
                    _collection.Add(smartFormB);
                    _collection.Add(smartFormC);
                    break;
                case "id = 34":
                    SmartForm smartForm2 = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    _collection.Add(smartForm2);
                    break;
                default:
                    break;
            }
        }
    }
}
War es hilfreich?

Lösung

Es ist nicht genau das gleiche Objekt sein muss, es muss nur erscheinen gleich externe Beobachter zu sein. Wenn Sie alle Daten von einem Objekt zum anderen kopieren, wird es das Gleiche erreichen.

public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    this.IdCode = smartForms[0].IdCode;
    this.Title = smartForms[0].Title;
}

Andere Tipps

können Sie erhalten nicht ein Objekt zu „werden“ eine andere.

Verwenden Sie statische Methoden anstelle von Konstrukteuren (und machen die Konstrukteure private / intern / was auch immer so, dass nur die statischen Methoden auf sie zugreifen kann). Es gibt zahlreiche Vorteile für die Verwendung von statischen Methoden über Konstrukteuren:

  • Sie können null zurück, wenn entsprechende
  • Sie können ein vorhandenes Objekt zurück, wenn entsprechende
  • Sie können eine Menge Arbeit tun und und einen einfachen Konstruktor aufrufen, die Felder nur Sätze

Der Nachteil ist, sie funktionieren nicht mit C # Sammlung / Objektinitialisierer: (

Eine Alternative zu statischen Methoden (die auch mit Dependency Injection nicht funktionieren, zugegebenermaßen) ist eine separate Fabrik haben und Instanz-Methoden auf das nennen.

Sie können nicht. Microsoft tut dies, indem stattdessen eine öffentliche statische Create () Methode zu definieren. Siehe zum Beispiel WebRequest und HttpWebRequest im System.Net-Namespace. Ich schlage vor, Sie das gleiche tun.

Machen Sie die Basisklasse Konstruktor interne oder privat, so kann es nicht direkt instanziiert werden. Oder noch besser, es eine abstrakte Klasse machen. Nutzen Sie die versteckten Konstrukteuren in Ihrem Create () Umsetzung.

Sie könnten einen internal oder protected Modifikator für den Konstruktor, statt public verwenden. So dass:

public SmartForm() {}
public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}

wird:

internal SmartForm() {}
internal SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}

Sie können eine private Klasse machen SmartFormData genannt, und alle Werte in sie setzen.

Machen Sie die SmartForms Plural Klasse eine Sammlung dieser Objekte halten und machen den SmartForm Singular Konstruktor die richtige SmartFormData Instanz in SmartForms Plural finden.

Dann werden alle Eigenschaften in SmartForm machen Singular holen ihre Werte aus SmartFormData

Allerdings ist der beste Weg, es zu tun ist, einen privaten Konstruktor haben und eine Factory-Methode verwenden.

Gibt es einen Grund, die Sie haben einen Konstruktor verwenden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top