1 回答

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è)算法的答案。你的編譯器將無法回答(這使得語言順便阻止它)
- 1 回答
- 0 關(guān)注
- 115 瀏覽
添加回答
舉報(bào)