接受两种采用不同参数的方法

时间:2013-11-30 16:46:16

标签: c# interface console-application

可能是一个无聊的问题,但我希望有人可以在这里帮助我,因为我完全迷失了。我有一项工作任务(我是一名研究生程序员,他们为我设置了一种“挑战”) - 别担心,我不是要求一个彻头彻尾的答案,这不是我的一天的一部分白天工作,只是额外的一点。但我认为它涉及接口,当涉及到它时我完全迷失了,所以想知道是否有人可以指出我正确的方向。

基本上我得到了一个注册表walker,它遍历注册表并根据给定的参数打印出控制台app上的键和值(参见下面的代码)

    class RegistryList
{
    public void RegistryWalker(RegistryKey _key, int _indent)
    {
        Output.RegistryOutPut(_indent, String.Format("Key: {0}", _key.Name.Split('\\').Last()));
        string[] straValues = _key.GetValueNames();

        foreach (string strValue in straValues)
        {
            RegistryValueKind kind = _key.GetValueKind(strValue);
            Output.RegistryOutPut(_indent + 1, String.Format("Value: {0}", strValue));
        }

        string[] straSubKeys = _key.GetSubKeyNames();

        foreach (string strSubKey in straSubKeys)
        {
            try
            {
                RegistryKey subKey = _key.OpenSubKey(strSubKey);
                RegistryWalker(subKey, _indent + 2);

                Thread.Sleep(200);
            }
            catch (System.Security.SecurityException)
            {
                Console.WriteLine("Denied Access");
            }
        }
    }

我必须为文件提出类似的文件,我已经完成了(再次参见下文)

    class FileList
{

     public void FileWalker()
    {
        StringCollection log = new StringCollection();

        string[] drives = Environment.GetLogicalDrives();

        foreach (string dr in drives)
        {
            DriveInfo di = new DriveInfo(dr);

            if (!di.IsReady)
            {
                Console.WriteLine("{0} could not be read", di.Name);
                continue;
            }

            DirectoryInfo rootDir = di.RootDirectory;
            Output.FileOutput(rootDir);

            Console.WriteLine("Files with restricted access:");

            foreach (string s in log)
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Press any key");
            Console.ReadKey();
        }
     }
}

对于记录,上面代码片段中的Output.RegistryOutput和Output.FileOutput调用调用单独的输出函数(工作正常,它们打印出每个注册表项和文件路径,但我需要一个函数 - 请参阅下面的注释)。

任务的最后一部分是将递归放入一个单独的函数中,该函数将采用FileWalker实例或RegistryWalker实例。有人在工作中向我指出解决问题的接口,但我完全迷失了。这两个函数将采用不同的参数,因此我无法看到单个接口如何工作,因为如果要使用注册表walker它需要RegistryKey和int值,但File walker没有参数。我已经创建了一个IWalker接口(下面再次),但我不知道这对两个函数都有用。

    interface IWalker
{
    void Walker();
}

任何人都可以为我阐明这一点吗?即使这是正确的方法,我已经迷失了很长一段时间,如果可能的话,肯定需要一些指示。

谢谢!

2 个答案:

答案 0 :(得分:0)

看看访客模式,希望它有所帮助。 http://en.wikipedia.org/wiki/Visitor_pattern

答案 1 :(得分:0)

最简单的方式我觉得这样的事情

interface IWalker
{
    void Walker(object a=null, object b=null);
}

class RegistryList: IWalker
{
    public void Walker(object a, object b){
        var _key = (RegistryKey)a;
        var _indent = Convert.ToInt32(b)
        RegistryWalker(_key, _indent)
    }

    private void RegistryWalker(RegistryKey _key, int _indent)
    { 
        ....
    }
}

class FileListIWalker
{
    public void Walker(object a=null, object b=null){
        FileWalker();
    }

    public void FileWalker(){...}
{