Почему я получаю сообщение об ошибке при создании интерфейса?
У меня есть класс и интерфейс, и когда я пытаюсь создать экземпляр интерфейса, я получаю сообщение об ошибке:
Невозможно создать экземпляр абстрактного класса или интерфейса
Мой код ниже:
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();
, я получаю сообщение об ошибке:
Невозможно создать экземпляр абстрактного класса или интерфейса
Что я здесь делаю неправильно?
Ответы
Ответ 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();