2015-06-05 2 views
0

Итак, у меня есть интерфейс, IFormLogger, который содержит метод «logData». У меня есть класс, который содержит этот интерфейс и методы интерфейса. Мой регистратор, который не зависит от каких-либо других классов, имеет объект «formOut», в котором хранится «новый класс()», который объявлен в другой программе.Запуск метода во время выполнения класса, реализующего интерфейс?

При попытке скомпилировать, я получаю «объект», не содержит определения для «logData», что понятно ».

Как сообщить компилятору, что объект, который он будет использовать, имеет этот интерфейс и метод, связанный с ним?

Код:

class logger 
{ 
    public enum logOutput { CONSOLE, WINFORM, FILE }; 
    public enum logLevel { INFO, FINE, WARN, ERR }; 

    logOutput output; 
    object formOut; 

public logger(logOutput outputType, object outputForm) 
    { 
     this.output = outputType; 
     if (!(outputForm is IFormLogger)) 
      throw new ArgumentException(); 
     else 
      this.formOut = outputForm; 
    } 
public void log(string msg) 
    { 
     string toLog = String.Format("[{0}][INFO] {1}\n", getTime(), msg); 
     if (output == logOutput.WINFORM) 
     { 
      formOut.logData(toLog); 
     } 
    } 

interface IFormLogger 
{ 
    void logData(string data); 
} 

В моем файле Program.cs, где регистратор строится (cLoggerTest это имя формы, которая реализует IFormLogger):

logger l = new logger(logger.logOutput.WINFORM, new cLoggerTest()); 
+0

Публичные имена участников должны быть UpperCamelCase. – SLaks

+0

@SLaks хорошо, спасибо, я программист-самоучка, поэтому мое форматирование не всегда совпадает с тем, как это должно быть – foxbot

ответ

3

Вы должны объявить поле и параметр как IFormLogger, а не object.
Затем компилятор позволит вам использовать все элементы интерфейса.

1

Сначала измените поле object formOut на IFormLogger formOut, а затем назначьте его, если/если аргумент имеет правильный тип.

Заменить это:

if (!(outputForm is IFormLogger)) 
    throw new ArgumentException(); 
else 
    this.formOut = outputForm; 

с этим:

this.formOut = outputForm as IFormLogger; 
if (this.formOut == null) 
    throw new ArgumentException(/*something useful*/); 
1

Вы просто должны объявить formOut как IFormLogger вместо объекта. Поскольку вы уже проверяете этот тип в своем коде, он не добавит никакой новой зависимости.

Смежные вопросы