Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#接口不';不允许成员类满足要求_C#_Interface - Fatal编程技术网

C#接口不';不允许成员类满足要求

C#接口不';不允许成员类满足要求,c#,interface,C#,Interface,抱歉,如果标题不是很有描述性。我不知道该怎么形容这个 首先,我创建了如下界面: public interface IUser {} public class Student : IUser {} public class Teacher : IUser {} 然后在几个类中实现它,如下所示: public interface IUser {} public class Student : IUser {} public class Teacher : IUser {} 然后我创建了一

抱歉,如果标题不是很有描述性。我不知道该怎么形容这个

首先,我创建了如下界面:

public interface IUser {}
public class Student : IUser {}

public class Teacher : IUser {}
然后在几个类中实现它,如下所示:

public interface IUser {}
public class Student : IUser {}

public class Teacher : IUser {}
然后我创建了一个需要第一个接口的接口

public class IUsers
{
    List<IUser> Users {get; set;}
}
公共类用户
{
列出用户{get;set;}
}
然后我创建了一个类,它使用第二个接口,但使用第一个接口的一个成员来填充契约

public class Students : IUsers 
{
    List<Student> Users {get; set;}
}
公共班级学生:IUsers
{
列出用户{get;set;}
}
问题是最后一个我想要将列表限制为接口的一个实现,但仍然需要维护接口以实现数据兼容性。当我这样做时,我会得到一个错误,说我没有实现接口。我认为既然Student实现了这个接口,它就可以满足这个义务,但它似乎没有。这是正确的还是我做错了什么

您需要说明您的收藏支持什么类型的用户。假设您的代码是有效的-那么这将编译:

IUsers users = new Students();
// What would this do at execution time? It's not safe!
users.Users.Add(new Teacher());
毕竟,这只是在
列表中添加一名
教师
,对吗?但是在
学生
中,
用户
属性是一个
列表
,因此不能接受教师

最好的方法可能是使您的
IUsers
界面在其接受的用户类型中具有通用性:

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

根据代码,对我来说,示例似乎表明您希望为用户维护单独的实现,然后返回所需的实现

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() { }); 
我提供的方法是基于这样一个概念,即您希望能够访问有关不同类型用户的信息、持久化和管理。您的示例显示了您正在添加的一个基本集合,可能会处理其他功能,但我认为您正在朝着更一致的方向努力


我可能不理解你的意图,但我就是这样解释的

这是一种标准类型的安全违规行为。如果这可以编译,那么代码可以使用接口将一个对象添加到实现IUser但不是学生的列表中。我想这就是我想要的,谢谢@邪恶寿司我有一种感觉,你试图实现上述目标,但不知道如何实现。很高兴这有帮助。