Составной шаблон С#: Program.IAsset не перечислим

Привет, я пытаюсь создать структуру каталогов, используя составной шаблон. У меня есть интерфейс IAsset, который реализован классом файлов и папок. Так что оба являются Активом. Теперь я хочу просмотреть все файлы во всех папках, но получаю сообщение об ошибке:

Program.IAsset нельзя перечислить

Это сообщение об ошибке находится во внутреннем цикле foreach метода getassetSize().

открытый класс Program { открытый интерфейс IAsset { double GetAssetSize(); недействительным 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);
    }
}

person armulator    schedule 20.07.2013    source источник


Ответы (2)


Чтобы соответствовать составному шаблону IAsset, необходимо наследовать IEnumerable<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; }
    }
}
person p.s.w.g    schedule 20.07.2013

Предполагая, что вы хотите суммировать размер файлов в каталоге, у вас слишком много циклов. Это сделало бы это...

public double GetAssetSize()


  {
        foreach (var asset in list)
        {
            _size += x.GetAssetSize();
        }
        return _size;
    }
person dbugger    schedule 20.07.2013