2011-07-07 271 views
28

我有一個類和接口,以及一個實例,當我嘗試實例化的界面,我得到一個錯誤:無法創建抽象類或接口

Cannot create an instance of the abstract class or interface

我的代碼如下:

namespace MyNamespace 
{ 
    public interface IUser 
    { 
     int Property1 { get; set; } 
     string Property2 { get; set; } 
     string Property3 { get; set; } 
     void GetUser(); 
    } 

    public class User : IUser 
    { 
     public int Property1 { get; set; } 
     public string Property2 { get; set; } 
     public string Property3 { get; set; } 

     public void GetUser() 
     { 
      //some logic here...... 
     } 

    } 
} 

當我嘗試實例IUser user = new IUser();我得到一個錯誤:

Cannot create an instance of the abstract class or interface

我在做什麼錯在這裏?

+1

嘗試實例化用戶,而不是界面。 – Jacob

回答

9

IUser是接口,你不能實例化接口。

您需要實例化實現接口的具體類。

IUser user = new User(); 

User user = new User(); 
+1

我想你的意思是「不能」實例化接口? –

2

你不能實例化一個抽象類或接口。如果它是一個抽象類,則必須繼承它,如果它是一個接口,則必須實現它。例如

... 
private class User : IUser 
{ 
    ... 
} 

User u = new User(); 
0

這就是它說的,你只是不能實例化一個抽象類。你需要先實現它,然後實例化那個類。

IUser user = new User(); 
35

錯誤消息似乎不言自明。您無法實例化接口的實例,並且您已將IUser聲明爲接口。 (同樣的規則也適用於抽象類。)接口的全部要點是它不是做的任何東西—沒有爲其方法提供的實現。

但是,您可以實例一類工具該接口(提供了方法的實現),而你的情況是User類的一個實例。

因此,代碼需要看起來像這樣:

IUser user = new User(); 

此實例化User類的一個實例(其提供實現),並將其分配給該接口類型(對象變量IUser,它提供了界面,作爲程序員可以與對象交互的方式)。

當然,你也可以這樣寫:

User user = new User(); 

它創建User類的實例,並將其分配給同一類型的對象變量,但那種失敗的定義的目的獨立的界面。

4

你不能實例化接口或抽象類。

這是因爲它沒有任何邏輯。

接口提供合同應該在類中的方法,沒有實現。 (所以在界面中沒有實際的邏輯)。

抽象類提供了一個類的基本邏輯,但功能並不全面(並非所有東西都實現了)。再一次,你將無法對此做任何事情。

27

想象一下,如果有人進入商店並要求使用電源開關的設備。你沒有說你是否想要一臺複印機,電視機,吸塵器,檯燈,華夫餅乾機等等。您要求使用電源開關的設備。你會期望店員給你提供一些只能被描述爲「帶電源開關的設備」嗎?

典型的接口類似於「帶有電源開關的設備」的描述。知道一件設備是「具有電源開關的設備」將允許人們對其進行一些操作(即打開和關閉),並且人們可能希望得到一個例如「 「帶有需要在一天結束時關閉的電源開關的設備」,而不需要具有除了具有電源開關之外的任何特性的設備共享,但是這種情況通常僅適用於對創建的設備應用一些共同操作用於某些更具體的目的。從零開始創建某個東西時,除了一些隨機的「帶有電源開關的設備」之外,更可能是「複印機」,「電視機」,「吸塵器」或其他特定類型的設備。

在某些情況下,人們可能想要一個模糊定義的對象,而真的不關心它到底是什麼。 「給我最便宜的可以煮沸水的裝置」。如果可以指定當有人要求一個具有「水沸騰」能力的任意物體時,他們應該被提供一個Acme 359電動茶壺,並且實際上在使用課程時可以做到這一點。但是,請注意,有人要求「燒水裝置」不會被給予「燒水裝置」,而是「Acme 359電茶壺」。