第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

C# 8默認(rèn)接口實(shí)現(xiàn)和繼承

C# 8默認(rèn)接口實(shí)現(xiàn)和繼承

C#
慕虎7371278 2023-09-16 16:14:29
我想使用 C# 8 默認(rèn)接口實(shí)現(xiàn)來解決代碼中的性能問題。實(shí)際上,我有這個(gè)界面:public interface IDataAdapter {}public interface IDataAdapter<T> : IDataAdapter{   void Insert(T value);}實(shí)際上,我必須對(duì)所有對(duì)象進(jìn)行反射IDataAdapter,檢查泛型類型并Insert通過反射調(diào)用特定的 T 實(shí)例。我想做的是: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);}編譯器建議使用關(guān)鍵字 new 來屏蔽繼承的方法。然而,我想要完成的唯一一件事是已經(jīng)實(shí)現(xiàn)了一個(gè)非通用方法,以使所有IDataAdapter<T>實(shí)現(xiàn)只需實(shí)現(xiàn)通用版本。這是我可以完成的事情還是仍然不可能?我已經(jīng)知道使用抽象類是解決這個(gè)問題的一種方法,但我想讓開發(fā)人員擁有一個(gè)實(shí)現(xiàn)許多 IDataAdapter 的類...這是我當(dāng)前的反射代碼: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貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

從面向?qū)ο蟮慕嵌葋砜?,你想要做的事情是無法完成的。


假設(shè)您創(chuàng)建以下類層次結(jié)構(gòu):


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 的實(shí)例,會(huì)發(fā)生什么很容易。但是 TestIFoo 獲得 C 又如何呢?目前,您的反射代碼將無法工作,因?yàn)槟鷾y試了類型相等性(C 等于 IFoo 嗎?不!即使 C as IFoo 沒問題)。這打破了里氏替換原則。如果某個(gè)東西適用于某個(gè)類,那么它也應(yīng)該適用于它的任何子類。


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


之所以要經(jīng)過反思,是因?yàn)樗羞@些問題都需要一個(gè)算法的答案。你的編譯器將無法回答(這使得語言順便阻止它)

查看完整回答
反對(duì) 回復(fù) 2023-09-16
  • 1 回答
  • 0 關(guān)注
  • 115 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)