覆盖一个方法,但在C#中返回应该是不同的?

时间:2014-06-01 13:02:14

标签: c# method-overriding

我有一个如下界面。

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。

1 个答案:

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