我有一个如下界面。
public interface IUser
{
List<AppUser> GetAllUser();
}
和实施。
public class ObjUser:IUserDao
{
public virtual List<AppUser> GetAllUser()
{
throw new NotImplementedException();
}
}
这很好用。
现在我想在 CUser 类中继承 ObjUser
public class CUser:ObjUser
{
public override List<ExtAppUser> GetAllUser()
{
List <ExtAppUser> extendeduser=new List<ExtAppUser>() ;
return extenduser;
}
}
ExtAppUser继承自AppUser类。
public class ExtAppUser:AppUser
{
///// Extend the properties.
}
但是我得到编译错误,因为返回类型应该相同。如何在C#中处理?我相信它可以用Java。
答案 0 :(得分:2)
您正在寻找一种破坏类型系统的方法。失败模式的一个简单示例是:
public AddUser(IUser users) {
var newuser = new AppUser("hans');
users.GetAllUser().Add(newuser);
}
...
var obj = new ObjUser();
foo.AddUser(obj);
如果此代码可以执行,则List<ExtAppUser>
将包含AppUser
类型的元素。这直接违反了该列表只能包含ExtAppUser
元素的承诺。
这当然不好。存在类型检查以阻止这样的事故。
这是一个称为&#34;协方差&#34;的一般问题。 C#版本4增加了一些支持,在this MSDN page中有描述。只要你让IUser.GetAllUser()返回一个可变对象,就不会让你到任何地方,你必须将返回类型降低到类似IEnumerable的类型。这是可以的,因为没有人可以通过该接口类型来破坏对象,它只允许从底层对象读取。这是否适用于您的设计是不可能的。