0

私は C# でポリモーフィズムを使用することを学んでいますが、これを理解できません。リポジトリからフィルター処理されたファイルのリストを取得できるクラスを作成しようとしています。

リポジトリは、ファイル システム フォルダー、または既に読み込まれている任意のアセンブリに埋め込まれたリソースである可能性があります (ただし、現在実行中のアセンブリではありません)。

助言がありますか?

4

2 に答える 2

2

次のようにインターフェイスのペアを定義できます。

public interface IReadableFile
{
    Stream OpenRead();
}

public interface IRepository
{
    IEnumerable<IReadableFile> Search(string pattern);
}

そして、それらの2つの異なる実装があります:

public class FolderFile : IReadableFile
{
    readonly private string _name;

    public FolderFile(string name)
    {
        _name = name;
    }

    #region IFile Members

    public Stream OpenRead()
    {
        return File.OpenRead(_name);
    }

    #endregion
}

public class FolderRepository : IRepository
{
    readonly private string _directory;

    public FolderRepository(string directory)
    {
        _directory = directory;
    }

    #region IRepository Members

    public IEnumerable<IReadableFile> Search(string pattern)
    {
        return Array.ConvertAll(Directory.GetFiles(_directory, pattern), name => new FolderFile(name));
    }

    #endregion
}

public class AssemblyFile : IReadableFile
{
    readonly private Assembly _assembly;
    readonly private string _name;

    public AssemblyFile(Assembly assembly, string name)
    {
        _assembly = assembly;
        _name = name;
    }

    #region IReadableFile Members

    public Stream OpenRead()
    {
        return _assembly.GetManifestResourceStream(_name);
    }

    #endregion
}

public class AssemblyRepository : IRepository
{
    readonly private Assembly _assembly;

    public AssemblyRepository(Assembly assembly)
    {
        _assembly = assembly;
    }

    #region IRepository Members

    public IEnumerable<IReadableFile> Search(string pattern)
    {
        return _assembly.GetManifestResourceNames().Where(name => name.Contains(pattern)).Select(name => new AssemblyFile(_assembly, name)).ToArray();
    }

    #endregion
}

そして、これらのインターフェースのみに依存し、それらの実装には依存しないアルゴリズムを作成できます。

于 2009-01-20T03:45:04.687 に答える
0
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace Reposes
{
    class ReposeFile
    {
        string m_name;

        public string Name
        {
            get { return m_name; }
        }

        public ReposeFile(string name)
        {
            m_name = name;
        }
    }

    interface IRepose
    {
        void RetriveFiles();
        ReposeFile[] Files { get; }
    }

    class FileSystemRepose : IRepose
    {
        string m_path = null;
        List<ReposeFile> m_files = new List<ReposeFile>();

        public FileSystemRepose(string path)
        {
            m_path = path;
        }

        #region IRepose Members

        public void RetriveFiles()
        {
            string[] files = Directory.GetFiles(m_path);
            foreach (string file in files)
            {
                m_files.Add(new ReposeFile(file));
            }
        }

        public ReposeFile[] Files
        {
            get { return m_files.ToArray(); }
        }

        #endregion
    }

    class AssemblyRepose : IRepose
    {
        string m_assembly = null;
        List<ReposeFile> m_files = new List<ReposeFile>();

        public AssemblyRepose(string assembly)
        {
            m_assembly = assembly;
        }

        #region IRepose Members

        public void RetriveFiles()
        {
            m_files.Add(new ReposeFile("Stuff"));
        }

        public ReposeFile[] Files
        {
            get { return m_files.ToArray(); }
        }

        #endregion
    }

    class Consumer
    {
        static void Main()
        {
            List<IRepose> reps = new List<IRepose>();
            reps.Add(new FileSystemRepose("c:\\")); // would normally be @"c:\" but stackoverflow's syntax highlighter barfed :)
            reps.Add(new AssemblyRepose("rep.dll"));

            foreach (IRepose rep in reps)
            {
                rep.RetriveFiles();

                foreach (ReposeFile file in rep.Files)
                {
                    Console.WriteLine(file.Name);
                }
            }

            Console.ReadKey();
        }
    }
}

これは大まかな例ですが、正しい方向に向ける必要があります:)

于 2009-01-20T03:30:34.887 に答える