簡體   English   中英

C#泛型和接口繼承接口

[英]C# Generics and Interface Inherits Interface

假設我有兩個接口,即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

希望這可以幫助。

如果要檢查項目的類型,請使用“是”:

if (passedItem is IFeatureA) { }

如果要將泛型限制為可以由接口或抽象類定義的某些行為,請使用“ where”:

public class foo<E> where E : IFeatureA
{
}

后一種情況不允許您使用IFeatureB,但是E類型的類中的任何變量都可以使用IFeatureA中定義的方法和屬性,而無需檢查類型。

您可能還需要查看動態類型,因為它更接近您想要執行的操作。

我會檢查像

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM