2014-02-27 73 views
-1

我試圖創建一個實例對接口,但它失敗了一個轉換轉換錯誤。爲什麼接口需要強制轉換?

以下簡單方案正常工作。

class Employee:IEmployee 
{ 
    public Employee (int Id) {} 
    public string Name {get;set;} 
} 

interface IEmployee 
{ 
    string Name {get;set;} 
} 

//執行

IEmployee employee = new Employee(1) 

我在相同的情況下是行不通的大課。他們主要是更大的班級。我得到下面的編譯時錯誤:

Cannot implicitly convert type 'IDirector' to 'Director'. An explicit conversion exists (are you missing a cast?) 

代替上述類型的語法的,我必須使用此:

IDirector myDirector = (IDirector)new Director(directorId); 

主任確實實現IDirector。這些是單個對象,而不是單個對象列表。

它也不會,如果我在通過類的構造函數傳遞一個接口和工作嘗試將其分配到實現該接口的類的類型:

private ClassB classb; 

Public ClassA (IClassB classbInterfaceInstance) 
{ 
    classb = classbInterfaceInstance; 
} 

任何想法,爲什麼需要在一些投案件但不是其他人?

+2

'Director'是直接實現'IDirector'還是簡單地提供一個轉換操作符? –

+0

它實現了接口。 – 4thSpace

+0

這是因爲你忘了在'Director'裏面實現'IDirector' :-) – dasblinkenlight

回答

0

您不能將接口實例分配給其驅動類。有一個深刻的概念,但我用簡單的例子來展示它。

考慮這個接口和類代碼:

interface IClassA 
{ 
    int MemOfA; 
} 

interface IClassB 
{ 
    int MemOfB; 
} 

class MyClass : IClassA,IClassB 
{ 
    int MemOfA; 
    int MemOfB; 
} 

現在一些代碼塊中,我們定義MyClass類的一個實例(考慮到iIClassA是接口IClassA的一個實例):

MyClass a = iIClassA; // error ! 

爲什麼錯誤?

我們如何在MyClass中設置IClassB的成員?但是,如果MyClass只會再執行IClassA,我們無法做到!因爲再次可能是IClassA繼承了多個接口。

+0

這不是我正在做的事情。這是相反的方式。問題似乎與VS.NET有些奇怪,而不是代碼錯誤。 – 4thSpace

+1

然後顯示你在做什麼?編輯你的問題並解釋它! –

0
private ClassB classb; 

Public ClassA (IClassB classbInterfaceInstance) 
{ 
    classb = classbInterfaceInstance; 
} 

這是不可能得到此代碼的工作。記住:ClassB實現IClassB。所以ClassB總是IClassB。 但是想想下面的場景: 你有一個接口:IClassB。有兩個類 - ClassB1和ClassB2。兩者都實現IClassB。

interface IClassB {} 
class ClassB1 {} 
class ClassB2 {} 

IClassB foo = new ClassB2(); 
ClassB1 = foo; //this can not work. Because you are trying to cast ClassB2 to ClassB1 

看看我的代碼。這正是你在做什麼:

private ClassB classb; 
//workaround 1) 
private IClassB classb; 

Public ClassA (/*workaround 2)*/ ClassB /*instaed of IClassB*/ classbInterfaceInstance) 
{ 
    //remember that classbInterfaceInstance can be ClassB2, ClassB3, ... what ever. But you are casting it into ClassB. 
    classb = classbInterfaceInstance; 

    //possible workarounds: 
    // 1) make the "classb" field of type "IClassB" (see above) 
    // 2) change the type of the classbInterfaceInstance parameter to ClassB 
    // 3) try to cast the parameter (see code below) 

    //workaround 3) 
    if(classbInterfaceInstance is ClassB) 
    { 
    classb = (ClassB)classbInterfaceInstance; 
    } 
} 
相關問題