重写一个方法,但返回值在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();
    }
}

现在我想继承ObjUserCUser

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中是可能的。

重写一个方法,但返回值在c#中应该不同

您正在请求一种破坏类型系统的方法。故障模式的一个简单示例是:

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。这是可以的,因为没有人可以通过接口类型破坏对象,它只允许从底层对象读取。这是否适用于你的设计很难说