[英]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.