簡體   English   中英

為什么我在實例化接口時會出錯?

[英]Why do I get an error instantiating an interface?

我有一個 class 和一個接口,當我嘗試實例化接口時,出現錯誤:

無法創建抽象 class 或接口的實例

我的代碼如下:

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(); 我收到一個錯誤:

無法創建抽象 class 或接口的實例

我在這里做錯了什么?

錯誤消息似乎不言自明。 您不能實例化接口的實例,並且您已將IUser聲明為接口。 (同樣的規則適用於抽象類。)接口的全部意義在於它不做任何事情——沒有為它的方法提供實現。

但是,您可以實例化實現該接口(為其方法提供實現)的 class 的實例,在您的情況下是User class。

因此,您的代碼需要如下所示:

IUser user = new User();

這將實例化User class (提供實現)的實例,並將其分配給接口類型的 object 變量( IUser ,它提供接口,作為程序員可以與對象交互的方式)。

當然,你也可以這樣寫:

User user = new User();

它創建了User class 的實例並將其分配給相同類型的 object 變量,但這首先違背了定義單獨接口的目的。

想象一下,如果一個人走進一家商店,要一種帶電源開關的設備。 你沒有說你是否想要一台復印機、電視、吸塵器、台燈、華夫餅機或其他任何東西。 您要求提供帶電源開關的設備。 您是否希望店員為您提供只能被描述為“帶電源開關的設備”的東西?

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

在某些情況下,人們可能想要一個定義模糊的 object,而實際上並不關心它到底是什么。 “給我你最便宜的可以燒水的設備”。 如果有人可以指定當有人要求具有“水沸騰”能力的任意 object 時,應該為他們提供一個 Acme 359 電水壺,並且確實在使用課程時可以做到這一點。 但是請注意,要求“燒水設備”的人不會得到“燒水設備”,而是“Acme 359 Electric Teakettle”。

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

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

IUser user = new User();

或者

User user = new User();

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

那是因為它沒有任何邏輯。

接口提供了應該在class中的方法的協定,無需實現。 (所以界面中沒有實際的邏輯)。

抽象類提供了 class 的基本邏輯,但功能不完整(並非所有內容都已實現)。 再說一次,你將無法用它做任何事情。

您不能實例化抽象 class 或接口。 如果它是抽象 class,則必須繼承它,如果它是接口,則必須實現它。 例如

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

User u = new User();

就是它所說的,你不能實例化一個抽象的 class。 您需要先實現它,然后實例化該 class。

IUser user = new User();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM