可能是一个无聊的问题,但我希望有人可以在这里帮助我,因为我完全迷失了。我有一项工作任务(我是一名研究生程序员,他们为我设置了一种“挑战”) - 别担心,我不是要求一个彻头彻尾的答案,这不是我的一天的一部分白天工作,只是额外的一点。但我认为它涉及接口,当涉及到它时我完全迷失了,所以想知道是否有人可以指出我正确的方向。
基本上我得到了一个注册表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();
}
任何人都可以为我阐明这一点吗?即使这是正确的方法,我已经迷失了很长一段时间,如果可能的话,肯定需要一些指示。
谢谢!
答案 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(){...}
{