2013-07-20 1 views
1

안녕하세요 저는 복합 패턴을 사용하여 디렉토리 구조를 만들려고합니다. 파일과 폴더 클래스에 의해 구현 된 인터페이스 IAsset이 있습니다. 둘 다 자산입니다. 지금은 모든 폴더에있는 모든 파일을 통해 루프 싶지만 오류 메시지가 점점 오전 :C# 복합 패턴 : Program.IAsset을 열거 할 수 없습니다

Program.IAsset가 열거되지 않습니다

이 오류 메시지가 getassetSize의 내부 foreach 루프에() 방법.

공용 클래스 프로그램 { 공용 인터페이스 IAsset { 더블 GetAssetSize(); void AddAsset (IAsset a); }

public class File : IAsset 
{ 
    public double Size { get; set; } 
    public double GetAssetSize() 
    { 
     return Size; 
    } 

    public void AddAsset(IAsset a) 
    { 
     Console.WriteLine("No asset can be added to a file"); 

    } 
} 

public class Folder : IAsset 
{ 
    public double Size { get { return _size; } set { _size = value; } } 

    private double _size = 0; 

    public List<IAsset> list = new List<IAsset>(); 

    public double GetAssetSize() 
    { 
     foreach (var asset in list) 
     { 
      foreach (var x in asset) 
      { 
      // _size = x.GetAssetSize(); 
      } 

     } 
     return _size; 
    } 

    public void AddAsset(IAsset a) 
    { 
     list.Add(a); 
    } 
} 

답변

0

IEnumerable<IAsset>을 상속하거나 구현하는 부재를 제공 할 필요가 복합 패턴 IAsset에 적합합니다.

public interface IAsset : IEnumerable<IAsset> 
{ 
    double GetAssetSize(); 
    void AddAsset(IAsset a); 
} 

public class File : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> GetEnumerator() 
    { 
     return new IAsset[0].GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

public class Folder : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> GetEnumerator() 
    { 
     return this.list.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

또는이 : 예를 들어

public interface IAsset 
{ 
    double GetAssetSize(); 
    void AddAsset(IAsset a); 
    IEnumerable<IAsset> Assets { get; } 
} 

public class File : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> Assets 
    { 
     get { return new IAsset[0]; } 
    } 
} 

public class Folder : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> GetEnumerator() 
    { 
     get { return this.list; } 
    } 
} 
+0

고맙습니다. – armulator

0

당신이 디렉토리에있는 파일의 크기를 합계를 가정하면, 당신은 가고 너무 많은 루프를 가지고있다. 이렇게 할거야 ...

public double GetAssetSize() 


    { 
     foreach (var asset in list) 
     { 
      _size += x.GetAssetSize(); 
     } 
     return _size; 
    } 
+0

감사합니다. 많이 감사합니다. – armulator