Почему я получаю сообщение об ошибке при создании интерфейса? - PullRequest
40 голосов
/ 07 июля 2011

У меня есть класс и интерфейс, и когда я пытаюсь создать экземпляр интерфейса, я получаю ошибку:

Невозможно создать экземпляр абстрактного класса или интерфейса

Мой код указан ниже:

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();, я получаю сообщение об ошибке:

Невозможно создать экземпляр абстрактного класса или интерфейса

Что я здесь не так делаю?

Ответы [ 6 ]

46 голосов
/ 07 июля 2011

Сообщение об ошибке кажется само собой разумеющимся. Вы не можете создать экземпляр интерфейса, и вы объявили IUser как интерфейс. (То же правило применяется к абстрактным классам.) Весь смысл интерфейса в том, что он не делает ничего & mdash; для его методов не предусмотрена реализация.

Однако вы можете создать экземпляр класса, который реализует этого интерфейса (обеспечивает реализацию для его методов), который в вашем случае является классом User.

Таким образом, ваш код должен выглядеть так:

IUser user = new User();

Это создает экземпляр класса User (который обеспечивает реализацию) и присваивает его переменной объекта для типа интерфейса (IUser, который предоставляет интерфейс, способ, которым вы, как программист, можете взаимодействовать с объектом).

Конечно, вы также можете написать:

User user = new User();

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

36 голосов
/ 07 июля 2011

Представьте себе, если вы зашли в магазин и попросили устройство с выключателем питания.Вы не сказали, хотите ли вы копир, телевизор, пылесос, настольную лампу, вафельницу или что-то еще.Вы попросили устройство с выключателем питания.Ожидаете ли вы, что клерк предложит вам что-то, что можно описать только как «устройство с выключателем питания»?

Типичный интерфейс будет аналогичен описанию «устройство с выключателем питания».Зная, что часть оборудования является «устройством с выключателем питания», можно было бы выполнять с ним некоторые операции (т.е. включать и выключать его), и можно правдоподобно хотеть список, например, «устройств с выключателями питания, которые потребуются».быть выключенным в конце дня ", без устройств, имеющих общую характеристику, помимо наличия выключателя питания, но такие ситуации обычно применяются только при применении некоторых общих операций к устройствам, которые были созданы для какой-то более конкретной цели.Создавая что-то с нуля, можно было бы чаще использовать «копир», «телевизор», «пылесос» или другой конкретный тип устройства, чем какое-то случайное «устройство с выключателем питания».

ТамЕсть некоторые обстоятельства, когда кто-то может хотеть неопределенно определенный объект, и действительно не заботиться о том, что именно это.«Дайте мне ваше самое дешевое устройство, которое может кипятить воду».Было бы неплохо, если бы можно было указать, что, когда кто-то запрашивает произвольный объект со способностью «кипения воды», ему следует предложить электрический чайник Acme 359, и действительно, при использовании классов это можно сделать.Тем не менее, обратите внимание, что тот, кто просит «устройство для кипячения воды», получит не «устройство для кипячения воды», а «Acme 359 Electric Teakettle».

15 голосов
/ 07 июля 2011

IUser - это интерфейс, вы не можете создать экземпляр интерфейса.

Вам нужно создать экземпляр конкретного класса, который реализует интерфейс.

IUser user = new User();

или

User user = new User();
5 голосов
/ 07 июля 2011

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

Это потому, что у него не будет никакой логики.

Интерфейсы предоставляют контракт методов, которые должны быть в классе, без реализации.(Таким образом, в интерфейсе нет реальной логики).

Абстрактные классы предоставляют базовую логику класса, но не полностью функциональны (не все реализовано).Опять же, вы не сможете ничего с этим поделать.

2 голосов
/ 07 июля 2011

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

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

User u = new User();
0 голосов
/ 07 июля 2011

Это то, что говорится, вы просто не можете создать экземпляр абстрактного класса. Сначала нужно реализовать его, а затем создать экземпляр этого класса.

IUser user = new User();
...