Интерфейс C # Не позволяет классу члена выполнять требования - PullRequest
0 голосов
/ 10 мая 2018

Извините, если заголовок не очень описательный.Я не знал, как это описать.

Сначала я создал такой интерфейс:

public interface IUser {}

Затем реализовал его в нескольких классах, таких как:

public class Student : IUser {}

public class Teacher : IUser {}

Затем я создал интерфейс, который требовалпервый интерфейс

public class IUsers
{
    List<IUser> Users {get; set;}
}

Затем я создал класс, который использовал второй интерфейс, но использовал одного из членов первого интерфейса для заполнения контракта.

public class Students : IUsers 
{
    List<Student> Users {get; set;}
}

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

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Основываясь на коде, мне кажется, что пример показывает, что вы хотели бы поддерживать отдельные реализации для своих пользователей, а затем возвращать желаемую реализацию.

public interface IStudentFactory
{
     IUser Create();
}

public class StudentFactory
{
    public IUser Create() => new StudentContext();
}

Затем на основе вашей реализации в вашем интерфейсеIUser, вы можете подключиться к своему хранилищу данных для управления этими типами пользователей.

var context = new StudentFactory().Create())
var students = context.GetAllStudents();
context.Students.Add(new Student() { }); 

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

Возможно, я не в курсе ваших намерений, но именно так я и истолковал.

0 голосов
/ 10 мая 2018

Вы должны сказать, каких добрых пользователей поддерживает ваша коллекция.Предположим, ваш код действителен - тогда это скомпилируется:

IUsers users = new Students();
// What would this do at execution time? It's not safe!
users.Users.Add(new Teacher());

В конце концов, это просто добавление Teacher к List<IUser>, верно?Но в Students свойство Users является List<Student>, поэтому он не может принять учителя.

Наилучший подход, вероятно, состоит в том, чтобы сделать ваш интерфейс IUsers универсальным для типа пользователя.он принимает:

public class IUsers<TUser> where TUser : IUser
{
    List<TUser> Users {get; set;}
}

Тогда ваш класс Students реализует IUsers<Student>, и свойство будет в порядке.

В этот момент проблемный пример вверху ответане сможет скомпилировать:

// This is fine
IUsers<Student> users = new Students();
// This won't compile, because users.Users is of type List<Student>, and you can't add
// a Teacher to that.
users.Users.Add(new Teacher());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...