2

独自のプロパティを参照するクラスプロパティをループできるようにしたい。なぜあなたは尋ねるかもしれませんか?そのクラスにさらにプロパティを追加したい場合は、後で管理する方が簡単だからです。

もっと説明させてください:

public interface IElementBox
{
    string Filename { get; }
    string FileDefinition { get; set; }
    void ExtractFromFile(string stringData);
}

public abstract class Element
{
    public Element(string stringData)
    {
        this.DefFromFile(stringData);
    }
    public string Name { get; set; }
    protected abstract void DefFromFile(string stringData);
}

public class Solid : Element
{
    public Solid(string stringData) : base(stringData) { }
    public string SolidSpecificProperty { get; set; }
    protected override void DefFromFile(string stringData)
    {
        // Assign SolidSpecificProperty from string
    }
}

public class Liquid : Element
{
    public Liquid(string stringData) : base(stringData) { }
    public string LiquidSpecificProperty { get; set; }
    protected override void DefFromFile(string stringData)
    {
        // Assign LiquidSpecificProperty from string
    }
}

public class Gas : Element
{
    public Gas(string stringData) : base(stringData) { }
    public string GasSpecificProperty { get; set; }
    protected override void DefFromFile(string stringData)
    {
        // Assign GasSpecificProperty from string
    }
}

public abstract class ElementBox<T> : IElementBox where T : Element
{
    public List<T> Elements { get; set; }
    public List<T> GetElementsFromName(string name)
    {
        return this.Elements.FindAll(x => x.Name == name);
    }
    public abstract string Filename { get; }
    public string FileDefinition { get; set; }
    public abstract void ExtractFromFile(string filename);
}

public class SolidBox : ElementBox<Solid>
{
    public override string Filename
    {
        get { return "Solid.txt"; }
    }
    public override void ExtractFromFile(string stringData)
    {
        this.Elements.Add(new Solid(stringData));
    }
}

public class LiquidBox : ElementBox<Liquid>
{
    public override string Filename
    {
        get { return "Liquid.txt"; }
    }
    public override void ExtractFromFile(string stringData)
    {
        this.Elements.Add(new Liquid(stringData));
    }
}

public class GasBox : ElementBox<Gas>
{
    public override string Filename
    {
        get { return "Gas.txt"; }
    }
    public override void ExtractFromFile(string stringData)
    {
        this.Elements.Add(new Gas(stringData));
    }
}

public static class DataDefinition
{
    public static SolidBox SolidBox { get; set; }
    public static LiquidBox LiquidBox { get; set; }
    public static GasBox GasBox { get; set; }

    public static IElementBox[] ElementBoxes = new IElementBox[] { DataDefinition.SolidBox, DataDefinition.LiquidBox, DataDefinition.GasBox };
}

public static class Loader
{
    public static void LoadInfo()
    {
        for (int elementBoxNb = 0; elementBoxNb < DataDefinition.ElementBoxes.Length; elementBoxNb++)
        {
            string dataFilepath = DataDefinition.ElementBoxes[elementBoxNb].Filename;
            System.IO.StreamReader sr = System.IO.File.OpenText(dataFilepath);
            DataDefinition.ElementBoxes[elementBoxNb].ExtractFromFile(sr.ReadToEnd());
        }
    }
}

この構造の全体的な目的は、テキストファイル内のすべてのオブジェクトプロパティを定義できるようにすることです。そのため、すべてのSolidBox.Elementsオブジェクトは、そのテキストファイル定義から動的に割り当てられます。

私の質問は次のとおりです。

  • DataDefinitionのプロパティ配列は値によって参照されますか?これは、私のすべてのデータ割り当てが空白に吸収されることを意味しますか?

  • はい(またはいいえ..)の場合、すべてを行うためのより良い方法はありますか/それを行うための最良の方法は何でしょうか?

私はしばらくの間そのデータ構造に取り組んできましたが、今では自分が達成できることを誇りに思っています。それがすべて無料で行われたら、私は悲しいでしょう。とはいえ、もしあなたが私にすべてを行うためのより良い/最適な方法を提供してくれれば、私は感謝し、私のコードを私のアーカイブフォルダーに投げます。

また、これはデータ構造の例であることに注意してください。それは私のコードがどのように見えるかを正確に反映しておらず、理解と読みを容易にするために作られています。

さらに情報が必要な場合は、遠慮なく質問してください。

4

2 に答える 2

1

デシリアライズ(永続メディアからオブジェクトを読み込む)は、無数の異なる方法で解決されました。この回答が示すように、データコントラクトを使用してみてください。シリアル化する対象を示すために、プロパティにいくつかの属性を追加するだけで、ほぼすべての作業が実行されます。

于 2012-11-06T03:06:35.953 に答える
0

これはあなたが望むことをしません。配列には、初期化時にプロパティによって参照されるオブジェクトへの参照が含まれます。この場合は、になりますnull。プロパティに何かを割り当ててもSolidBox、配列の関連する要素は変更されません。その逆も同様です。

于 2012-11-06T03:10:07.273 に答える