重写一个方法,但返回值在c#中应该不同
本文关键字:返回值 一个 方法 重写 | 更新日期: 2023-09-27 18:06:03
我有一个像下面这样的界面
public interface IUser
{
List<AppUser> GetAllUser();
}
和实现。
public class ObjUser:IUserDao
{
public virtual List<AppUser> GetAllUser()
{
throw new NotImplementedException();
}
}
现在我想继承ObjUser在CUser类
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中是可能的。
您正在请求一种破坏类型系统的方法。故障模式的一个简单示例是:
public AddUser(IUser users) {
var newuser = new AppUser("hans');
users.GetAllUser().Add(newuser);
}
...
var obj = new ObjUser();
foo.AddUser(obj);
如果此代码可以执行,则List<ExtAppUser>
将包含类型为AppUser
的元素。这直接违反了列表只能包含ExtAppUser
元素的承诺。
这当然不好。类型检查的存在是为了防止类似的事故。
这是一个叫做"协方差"的一般问题。c#版本4对此添加了一些支持,在这个MSDN页面中有描述。只要让IUser.GetAllUser()返回一个可变对象,那么就不会有任何结果,您必须将返回类型降低为一个小得多的类型,如IEnumerable。这是可以的,因为没有人可以通过接口类型破坏对象,它只允许从底层对象读取。这是否适用于你的设计很难说