2013-11-30 3 views
0

Наверное, нубийский вопрос, но я надеялся, что кто-то может помочь мне здесь, так как я полностью потерян. У меня есть задача сделать для работы (я программист-выпускник, и они поставили меня «вызов») - не волнуйтесь, я не прошу прямого ответа, и это не часть моего дня, чтобы дневная работа, просто какая-то дополнительная. Но я думаю, что это связано с интерфейсами, и я полностью потерялся, когда дело доходит до них, поэтому было интересно, может ли кто-нибудь указать мне в правильном направлении.Интерфейс для двух методов, которые принимают разные параметры

В основном я получил ходунки реестра, что петли через реестр и печатает ключи и значение на консольном приложении на основе заданного параметра (см ниже код)

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 вызовов в фрагментах кода выше отдельного вывод вызова функций (которые работают хорошо, они распечатывают каждый раздел реестра и fil e, но мне нужна одна функция для обоих - см. комментарии ниже).

Заключительная часть задачи состояла в том, чтобы перевести рекурсию в отдельную функцию, которая либо примет экземпляр FileWalker, либо экземпляр RegistryWalker. Кто-то в работе указал мне на Интерфейсы для решения проблемы, но я полностью потерял. Эти две функции будут принимать разные параметры, поэтому я не могу понять, как работает один интерфейс, поскольку, если хост-хост реестра должен использоваться, ему требуются значения RegistryKey и int, но хост File не имеет параметров. Я создал один интерфейс IWalker (опять же, ниже), но я не вижу, как это будет работать для обеих функций.

interface IWalker 
{ 
    void Walker(); 
} 

Может ли кто-нибудь пролить свет на это для меня? И даже если это правильный путь, я уже давно теряюсь на этом, и, если возможно, определенно нужно несколько указателей.

Спасибо!

ответ

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(){...} 
{ 
Смежные вопросы