Подтвердить что ты не робот

Почему я получаю сообщение об ошибке при создании интерфейса?

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

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

Мой код ниже:

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

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

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

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

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

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

IUser user = new User();

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

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

User user = new User();

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

Ответ 2

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

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

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

Ответ 3

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

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

IUser user = new User();

или

User user = new User();

Ответ 4

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

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

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

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

Ответ 5

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

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

User u = new User();

Ответ 6

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

IUser user = new User();