2012-11-06 3 views
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의 속성 배열 값에 의해 참조됩니다. 그렇다면 모든 데이터 할당이 무효화됩니다.

  • 예 (또는 아니요 ..) 인 경우 전체를 수행하는 더 좋은 방법입니다./가장 좋은 방법은 무엇입니까?

나는 잠시 동안 그 데이터 구조에 대해 연구 해왔다. 지금 나는 내가 성취 할 수 있었던 것을 자랑스럽게 생각한다. 모든 일이 끝나면 나는 슬퍼 질 것입니다. 비록 당신이 모든 일을하는 더 나은/최적의 방법을 제게 제공 할 수 있다면, 감사드립니다. 내 코드를 내 보관 폴더에 던지십시오.

또한 데이터 구조의 예입니다. 내 코드가 어떻게 보이는지 정확히 반영하지 않으며 이해와 읽기를 쉽게하기 위해 만들어졌습니다.

추가 정보가 필요하면 언제든지 질문하십시오.

+0

질문 : 왜 모든 사람이 이런 식으로 일하지 않습니까? –

+0

속성 배열 관련. 올바른 인덱스 또는 포인터를 가리키는 열거 형을 사용할 것입니다 (모르겠습니다). 그런 다음 속성 가져 오기를 변경하고 해당 열거 형을 사용하도록 설정합니다. 배열은 이제 값별 지정을 중심으로 작동하는 중앙 집중식 정보를 포함하는 유일한 장소가됩니다. 아마도 데이터 지속성을 위해 XML 직렬화를 사용할 것입니다. 모두에게 감사드립니다. – user1801742

답변

1

역 직렬화 (영구적 인 매체에서 객체를 읽음)는 수천 가지 다른 방법으로 해결되었습니다. this answer에서와 같이 데이터 계약을 사용해보세요. 속성에 몇 가지 특성을 추가하여 직렬화 할 항목을 표시 한 다음 모든 작업에 대해 수행해야합니다.

+0

직렬화는 내가 불행하게도 찾고있는 것이 아닙니다. 개체를 초기화하는 데 사용되는 파일은 텍스트 파일이어야합니다. 읽을 수 있어야하며 수정할 수 있어야하는 텍스트 파일입니다. 직렬화는 정확하게 기억한다면, 편집을위한 것이 아닌 다소 복잡한 파일을 생성합니다. 그래도 고마워. – user1801742

+1

직렬화는 매체에 대한 객체의 지속성입니다. 어떤 복잡성이나 가독성을 의미하지는 않습니다. 그것은 구현 자의 몫입니다. 이진 직렬화는 인간이 읽을 수있는 최소한의 것입니다. 반면 Xml 또는 C# 디자이너 코드와 같은 것은 인간이 읽을 수있는 것입니다. 원한다면 문장을 직렬화 할 수 있지만 기계가 읽을 수있는 것은 아닙니다. 나는 개인적으로 XML 데이터 계약이 완벽하게 읽을 수 있다고 생각하지만, 목적에 맞지 않을 수도있다.그렇지 않다면 직렬화 개념을 사용하여 원하는 형식을 사용하는 고유 한 직렬 변환기를 작성할 수 있습니다. –

+0

감사합니다. 이것이 제가해야 할 일이라고 생각합니다. Xml serialization을 사용하기에 너무 어려워 읽지 않기를 바랄 것입니다. 그렇지 않으면, 나는 내 자신의 시리얼 화자로 갈 것이라고 생각한다. – user1801742

0

원하는대로 할 수 없습니다. 배열에는 초기화 될 때 속성에 의해 참조되는 객체에 대한 참조가 포함되며이 경우 null이됩니다. SolidBox 속성에 무언가를 지정하면 배열의 관련 요소가 변경되지 않으며 그 반대의 경우도 마찬가지입니다.

+0

감사합니다. 그게 내가 한 일이야. 그래도 더 나은 방법에 대한 제안이 있으십니까? 답변 해주셔서 감사합니다. – user1801742