gpt4 book ai didi

c# - 重写一个方法但在 C# 中返回应该不同?

转载 作者:太空宇宙 更新时间:2023-11-03 10:44:30 25 4
gpt4 key购买 nike

我有一个如下所示的界面。

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

最佳答案

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

public AddUser(IUser users) {
var newuser = new AppUser("hans');
users.GetAllUser().Add(newuser);
}
...
var obj = new ObjUser();
foo.AddUser(obj);

如果此代码可以执行,则 List<ExtAppUser>将包含 AppUser 类型的元素.这直接违反了列表只能包含 ExtAppUser 的 promise 。元素。

这当然不好。类型检查的存在是为了防止这样的事故。

这是一个称为“协方差”的一般问题。 C# 版本 4 添加了对它的一些支持,如 this MSDN page 中所述。 .只要您让 IUser.GetAllUser() 返回一个可变对象,这不会让您到达任何地方,您必须将返回类型调低为更小的类型,如 IEnumerable。这没关系,因为没有人可以通过该接口(interface)类型破坏对象,它只允许从底层对象读取。这是否适用于您的设计尚无定论。

关于c# - 重写一个方法但在 C# 中返回应该不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com