亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 8默認接口實現和繼承

C# 8默認接口實現和繼承

C#
慕虎7371278 2023-09-16 16:14:29
我想使用 C# 8 默認接口實現來解決代碼中的性能問題。實際上,我有這個界面:public interface IDataAdapter {}public interface IDataAdapter<T> : IDataAdapter{   void Insert(T value);}實際上,我必須對所有對象進行反射IDataAdapter,檢查泛型類型并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 });                }            }        }    }
查看完整描述

1 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

從面向對象的角度來看,你想要做的事情是無法完成的。


假設您創建以下類層次結構:


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 沒問題)。這打破了里氏替換原則。如果某個東西適用于某個類,那么它也應該適用于它的任何子類。


假設您解決了上述問題?,F在 TestIBoth 獲得 C 怎么樣?其中是否有兩種不同的 Insert 實現?當然,這是繼承所必需的!但是……你必須插入 C 兩次嗎?還是必須在第一種安裝方法中只插入一次?


之所以要經過反思,是因為所有這些問題都需要一個算法的答案。你的編譯器將無法回答(這使得語言順便阻止它)

查看完整回答
反對 回復 2023-09-16
  • 1 回答
  • 0 關注
  • 118 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號