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# 中访问其方法的最佳方法是什么?根据两种接口类型检查对象类型,然后强制转换为类型是最佳方法吗?

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 {}