無,編譯器不允許相同的名稱字段是不同的t數據類型,而不是在派生類中的接口中定義的數據類型。
應該在派生類中實現屬性(因爲在接口中不允許有字段),它們需要具有相同的數據類型。所以,你不可能在沒有明確聲明的情況下用屬性來做。然而,如果你讓一個函數返回Value,那麼它可以工作,但是你需要檢查返回類型,因爲返回類型應該匹配該函數,否則你會得到錯誤,說明該接口的函數沒有實現。
interface IControl
{
object Value();
}
class A : IControl
{
string m_value = string.Empty;
public object Value() { return m_value; }
};
class B : IControl
{
List<IControl> m_value = new List<IControl>();
public object Value() { return m_value; }
};
....
object o = new B().Value();
if (o is List<IControl>)
MessageBox.Show("List");
[更新]
你必須要小心,如果顯式定義屬性的身體。如果不謹慎地執行實施,那麼擁有兩個屬性的名稱會很危險。
這兩個屬性如果包含不同的定義,那麼對於接口和類的最終使用將是無法解釋的。
public IList<IControl> Value
object IControl.Value
見這個例子:
...
class Repeater : IControl
{
List<IControl> m_Value = new List<IControl>();
public IList<IControl> Value
{
get { return this.m_Value; }
set { this.m_Value = (IList<IControl>)value; }
}
object IControl.Value
{
get
{
return this.m_Value;
}
set
{
this.m_Value = new List<IControl>();
this.m_Value.Add(new Label());
this.m_Value.AddRange((List<IControl>)value);
}
}
}
...
Repeater b = new Repeater();
IControl i = b;
List<IControl> list = new List<IControl>();
list.Add(new Repeater());
i.Value = list;
你可以看到,在轉發列表容器會有不同的值,當數據通過ICONTROL增加(因爲IContainer.Value的明確定義的)。
你在問什麼? – SLaks 2010-04-18 19:48:47
@SLaks:LOL對不起,我可能需要有一個視頻剪輯解釋它好一點。試圖進入更多的細節可能會導致一個新穎的 – used2could 2010-04-18 19:51:26
我試圖讓所有控件類實現相同的接口,但具有不同類型的值屬性。 – used2could 2010-04-18 19:59:51