gpt4 book ai didi

C#协变和继承

转载 作者:太空狗 更新时间:2023-10-29 20:03:36 27 4
gpt4 key购买 nike

我很想知道为什么我的接口(interface)在抽象基类中的实现不满足子类中的要求。这是一个例子:

public interface IBase { }
public interface IConcrete : IBase { }

public interface IBaseManager<out T>
where T : IBase
{
T Create();
IEnumerable<T> SelectAll();
}

public interface IConcreteManager : IBaseManager<IConcrete> { }

public abstract class Base : IBase { }

public class Concrete1 : Base, IConcrete { }

public abstract class BaseManager<T> : IBaseManager<T> where T : class, IBase
{
#region IBaseManager<T> Members

public T Create()
{
throw new NotImplementedException();
}

public IEnumerable<T> SelectAll()
{
throw new NotImplementedException();
}

#endregion
}

public class ConcreteManager : BaseManager<Concrete>, IConcereteManager
{
//error occurs here
}

这是正在生成的错误:

'ConsoleApplication4.ConcreteManager' does not implement interface member 'ConsoleApplication4.IBaseManager<ConsoleApplication4.IConcrete>.Create()'.

'ConsoleApplication4.BaseManager<ConsoleApplication4.Concrete>.Create()' cannot implement 'ConsoleApplication4.IBaseManager<ConsoleApplication4.IConcrete>.Create()' because it does not have the matching return type of 'ConsoleApplication4.IConcrete'.

如果我将这些方法添加到 ConcreteManager 类,一切都很好,编译器也很满意。

public new IConcrete Create()
{
return base.Create();
}

public new IEnumerable<IConcrete> SelectAll()
{
return base.SelectAll();
}

如果简单地返回基类方法返回的内容就足够了,为什么还要添加方法?为什么编译器不能调用基类中的方法?

最佳答案

正如 John 正确指出的那样,C# 语言不支持返回类型协变。 CLR 也不支持,因此即使语言支持它,我们实际实现该功能的唯一方法是默默地生成您必须自己添加的代码。

避免编写这些 stub 方法给开发人员带来的小好处实际上并不能证明执行更通用的协方差功能的可观成本是合理的,因此我们从未这样做过。

关于C#协变和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287129/

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