gpt4 book ai didi

C#8默认接口(interface)实现与继承

转载 作者:行者123 更新时间:2023-11-30 22:53:07 26 4
gpt4 key购买 nike

我想使用 C# 8 默认接口(interface)实现来解决我的代码中的性能问题。

实际上,我有这个接口(interface):

public interface IDataAdapter {}
public interface IDataAdapter<T> : IDataAdapter
{
void Insert(T value);
}

我实际上必须对所有 IDataAdapter 进行反射(reflection), 检查通用类型并调用 Insert通过特定 T 实例的反射。我想做的是:

public interface IDataAdapter 
{
void InsertValue(object value);
}
public interface IDataAdapter<T> : IDataAdapter
{
void Insert(T value);
public void InsertValue(object value) => Insert(value as T);
}

编译器说要使用关键字 new 来屏蔽继承的方法。然而,我想要完成的唯一一件事就是已经实现了一个非通用方法来制作所有 IDataAdapter<T>实现只需实现通用版本。

这是我可以完成还是仍然不可能的事情?我已经知道使用抽象类是解决这个问题的一种方法,但我想让开发人员拥有一个实现许多 IDataAdapter 的类......

这是我当前的反射代码:

public IEnumerable<IDataAdapter> DataAdapters { get; }

public Repository(IEnumerable<IDataAdapter> dataAdapters)
{
DataAdapters = dataAdapters;
}

public async Task SaveAsync()
{
foreach (var item in aggregates)
{
foreach (var dataAdapter in DataAdapters)
{
if (dataAdapter.GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericArguments()[0] == item.GetType()))
{
dataAdapter.GetType().GetMethod("Insert", new[] { item.GetType() }).Invoke(dataAdapter, new[] { item });
}
}

}
}

最佳答案

从面向对象的角度来看,您无法完成您想要做的事情。

假设您创建了以下类层次结构:

public interface  IFoo{}
public interface IBar{}
public class A: IFoo{}
public class B: IFoo{}
public class C:IFoo,IBar {}

然后是以下适配器:

public class TestA : IDataAdapter<A>{}
public class TestB : IDataAdapter<B>{}
public class TestC : IDataAdapter<C>{}
public class TestIFoo : IDataAdapter<IFoo>{}
public class TestIBar : IDataAdapter<IBar>{}
public class TestIBoth : IDataAdapter<IFoo>,IDataAdapter<IBar>{}

如果 TestA 接收到 A 的实例,会发生什么情况非常简单。但是 TestIFoo 得到 C 怎么办?目前你的反射代码不会工作,因为你测试类型相等(C 等于 IFoo 吗?不!即使 C as IFoo 没问题)。这打破了 Liskov 替换原则。如果某个东西适用于一个类,那么它也应该适用于它的任何子类。

假设您修复了上述问题。现在 TestIBoth 获得 C 怎么样? Insert 有两种不同的实现吗?当然,这是继承所需要的!但是然后......你必须插入两次C吗?还是必须在第一种拟合方法中只插入一次?

你之所以需要反射(reflection),是因为所有这些问题都需要一个算法答案。你的编译器将无法回答(这使得语言顺便阻止它)

最后,我强烈建议使用一种非常不同的解决方案(例如 Wim Coenen 提出的解决方案)

关于C#8默认接口(interface)实现与继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57606599/

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