TL; DR
在接口中隱藏屬性有什麼問題,以便我可以更改其聲明以返回原始屬性的派生類型?在返回派生類型的派生接口中隱藏屬性是可以接受的嗎?
我確定這個問題以前一定要問過,但是我找不到它,並且爲長期問題道歉。
說我有這樣的情況:
public interface A
{
B TheB{get;}
}
public interface MoreSpecificA : A
{
MoreSpecificB TheMoreSpecificB{get;}
}
public interface B{...}
public interface MoreSpecificB:B{...}
我想的MoreSpecificA
用戶能夠得到的是一個MoreSpecificB
的B中。他們可以通過撥打TheB
並轉換它,或者他們可以調用方法TheMoreSpecificB
。我還可以聲明MoreSpecificA
像這樣:
public interface MoreSpecificA : A
{
new MoreSpecificB TheB{get;}
}
所以現在他們可以用同樣的方法,並取回一個MoreSpecificB
。
使用new
隱藏一個方法使我的牙齒處於優勢,所以爲什麼這是一個壞主意?這似乎是一件合理的事情。
在大多數情況下,我所看到的一般建議似乎是使用泛型代替,但這似乎有一個問題,如果我有MoreSpecificA
,我想在聲明返回的方法中返回它類型爲A
,然後我必須MoreSpecificA
延長A
在MoreSpecificA
實例訪問TheB
時,因爲它不知道,如果你想A.TheB
或MoreSpecificA.TheB
public interface ABase<T> where T : B
{
T TheB{get;}
}
public interface A : ABase<B>
{
}
public interface MoreSpecificA : ABase<MoreSpecificB>,A
{
}
public class blah
{
public A GetA(MoreSpecificA specificA)
{
return specificA; //can't do this unless MoreSpecificA extends A
}
public B GetB(MoreSpecificA specificA)
{
return specificA.TheB; //compiler complains about ambiguity here, if MoreSpcificA extends A
}
}
這可以通過宣佈一個新的TheB來解決這給歧義MoreSpecificA(但又是新的問題)。
如果MoreSpecificA不在類擴展,則第一種方法blah
像現在的MoreSpcificA不能轉換爲A.
上述抱怨雖然寫這篇我注意到,如果我聲明我BaseA到被逆變這樣的:
public interface ABase<out T> where T : B
{
T TheB{get;}
}
和我的課是
public class blah
{
public ABase<B> GetA(MoreSpecificA specificA)
{
return specificA;
}
public B GetB(MoreSpecificA specificA)
{
return specificA.TheB; //compiler complains about ambiguity here
}
}
然後我得到兩全其美。此解決方案的適用性取決於A
是否向ABase
添加了任何內容?
或者是我原來的方案隱藏在派生類型的方法來返回原始方法的派生類型好嗎?
他們的方式,我看到它,你只是遇到了沒有多重繼承創造的限制之一。也許一些工廠或建築模式可以節省一天的時間。 – CodingBarfield 2012-03-20 09:59:00