gpt4 book ai didi

c# - 接口(interface)实现困惑

转载 作者:太空狗 更新时间:2023-10-30 00:00:11 25 4
gpt4 key购买 nike

假设你有这个:

// General purpose
public interface ISerializer
{
IDataResult Serialize<T>(T instance);
}

// General purpose
public interface IDataResult
{
}

// Specific - and I implement IDataResult
public interface IMyCrazyDataResult : IDataResult
{
}

public class MyCrazySerializer : ISerializer
{
// COMPILE ERROR:
// error CS0738: 'MyCrazySerializer' does not implement interface member 'ISerializer.Serialize<T>(T)'.
// 'MyCrazySerializer.Serialize<T>(T)' cannot implement 'ISerializer.Serialize<T>(T)' because it does
// not have the matching return type of 'IDataResult'.
public IMyCrazyDataResult Serialize<T>(T instance)
{
throw new NotImplementedException();
}
}

我到底为什么会遇到这个编译错误?我尊重接口(interface)——事实上,我确实返回了一个 IDataResult,尽管是间接的。是编译器无法解决这个问题还是这里存在根本性的(在 OO 级别)错误?

我认为拥有一个接口(interface)的全部意义在于我可以保证一些实现,但让我打开它来添加它。这就是我正在做的 - 但我收到编译错误。

在我的实际代码中,我希望返回类型更具体一些,因为我在派生接口(interface)中有几个额外的方法。如果我将 MyCrazySerializer.Serialize 的返回类型设置为 IDataResult 类型,那么智能感知只会向我显示基本的通用方法,我想在其中显示更具体的接口(interface)。

我还能怎样做到这一点?这段代码有什么问题???

最佳答案

C# 不支持 return type covariance所以你需要实现 Serialize<T>方法与界面上显示的完全相同。但是,您可以显式实现它,这意味着任何知道 MyCrazySerializer 真实类型的客户端可以访问更具体的方法:

public class MyCrazySerializer : ISerializer
{
public IMyCrazyDataResult Serialize<T>(T instance)
{
throw new NotImplementedException();
}

IDataResult ISerializer.Serialize<T>(T instance)
{
return this.Serialize(instance);
}
}

正如评论所指出的,您可以在显式实现中简单地调用更具体的版本。

您可以用作:

IMyCrazyDataResult result = new MyCrazySerializer().Serialize<int>(1);
ISerializer serializer = (ISerializer)new MyCrazySerializer();
IDataResult = serializer.Serialize<int>(1);

关于c# - 接口(interface)实现困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11595186/

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