C# 泛型和接口继承接口
本文关键字:接口 继承 泛型 | 更新日期: 2023-09-27 18:31:42
假设我有两个接口,IFeaturesA,IFeaturesB。
IFeaturesA有一套签名方法。假设一个是:-
public void printMe();
IFeaturesB 实现了 IFeaturesA,并添加了一个新的签名方法,例如:
public void printMeAlso();
假设我想使用通用方法,例如:-
public Check<E>(E passedItem)
{
}
如果我通过了IFeaturesA,我希望能够调用此方法。如果我传入IFeaturesB,我希望能够调用额外的方法printMeAlso();
检查传递到泛型方法中的接口类型并在 C# 中访问其方法的最佳方法是什么?根据两种接口类型检查对象类型,然后强制转换为类型是最佳方法吗?
这不适合泛型。
泛型是对行为的无类型重用。如果您需要检查类型,那么它不适合泛型。您可以施加约束,但不得在泛型方法中检查实际类型。
您试图抽象的只是您正在传递一个项目的事实。这不是一个抽象的概念。
使用两种方法
公共支票(IFeaturesA通过项目) {
}
公共支票(IFeaturesB通过项目) {
}
添加私有方法以处理通用性
不要认为这是通过定义接口来实现你想要的好方法,只需定义类结构,如
public class FeaturesA
{
public virtual void printMe()
{
}
}
public class FeaturesB : FeaturesA
{
public override void printMe()
{
}
}
在代码中使用后,例如
FeaturesA a = new FeaturesA();
FeaturesA b = FeaturesB();
public Check(A passedItem)
{
passedItem.printMe();
}
在Check(a)
打印 A,在Check(b)
打印 B
希望这有帮助。
检查项目的类型,请使用"is":
if (passedItem is IFeatureA) { }
如果要将泛型限制为可由接口或抽象类定义的某些行为,请使用"where":
public class foo<E> where E : IFeatureA
{
}
后一种情况不允许使用 IFeatureB,但类型 E 类中的任何变量都可以使用 IFeatureA 中定义的方法和属性,而无需检查类型。
您可能还想查看 Dynamic 类型,因为它更接近您想要执行的操作。
我会检查 E 的类型,例如
if(E.GetType().Equals(typeof(IFeaturesA)){ //call method...}
看起来像是对另一个接口的调用。
如果让两个接口都继承自仅包含Print()
方法的IPrintable
,并使用 where E : IPrintable
扩展Check<E>(E passedItem)
,则可以调用 passedItem.Print()
。
请尝试以下操作
Check(IFeaturesA f) {}
Check(IFeaturesB f){}
Check<T>(T obj) where T : IFeaturesA, IFeaturesB {}