2015-06-05 49 views
0

所以我有一個IFormLogger接口,它包含一個方法「logData」。我有一個包含此接口和接口方法的類。我的記錄器被設計爲不依賴於任何其他類,它有一個對象「formOut」,它存儲在另一個程序中聲明的「new class()」。在實現接口的運行時聲明類上運行方法?

當試圖編譯時,我得到一個「'對象'不包含'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而不是一個對象。 由於您已在代碼中檢查該類型,因此不會添加任何新的依賴關係。