2014-12-04 52 views
0

比方說,我有一個類:如何獲得明確的子類型,屬性

class AbstractPerson{ 

AbstractAttribute attr {get; set;} 

} 

現在,在AbstractPerson的子類,我想使用attr但是,在像這樣的特殊情況:

class Pilot: AbstractPerson { 

... 
(attr as SpecialAttribute).pilotID; 
... 
} 

因爲我不想這樣做,每次我打電話attr,我想在Pilot,讓後面的attr一個類型強制轉換版本的屬性,但我沒有得到這個工作。

所以,這不起作用:

class Pilot: AbstractPerson { 
AbstractAttribute attr { 
get 
{ 
return (attr as SpecialAttribute); 
} 
set; 
} 

} 

這甚至可能嗎?

***我知道按照慣例,「attr」應該在PascalCase中,我只是忘記了這個例子。實際上,人是一個控制者並且是一個視圖。

+0

那麼,您將'attr'返回爲'SpecialAttribute',但由於該屬性仍然是'AbstractAttribute'類型,因此您剛剛回到起點。你可以有一個*不同的屬性,如'SpecialAttribute attrSpecial {get {return attr as SpecialAttribute; }}'然後只在'Pilot'裏面使用。 – Corak 2014-12-04 08:12:58

+0

是的,你是對的。我雖然關於擁有另一個屬性,但是我不會擁有足以滿足兩件事情的ONE屬性:充當它的特殊事物,但仍然提供它當然具有的所有抽象事物。我認爲泛型解決方案是最好的。謝謝! – ruffy 2014-12-05 08:43:36

回答

1

假設,即:

class SpecialAttribute : AbstractAttribute {} 

您可以使用泛型:

class AbstractPerson<T> 
    where T : AbstractAttribute 
{ 
    T attr {get; set;} 
} 

class Pilot: AbstractPerson<SpecialAttribute> 
{ 
    /* ... */ 
    void Foo() 
    { 
     // attr is a SpecialAttribute here 
     attr.PropertyOfSpecialAttribute = "bar"; 
    } 
} 

注意,你發現你濫用as運營商。
如果存在這樣的可能性,即attr不是SpecialAttribute,比as必須後跟空檢查:

var foo = bar as Foo; 
if (foo != null) 
{ 
    // do something 
} 

否則(如果attr必須SpecialAttribute),你必須使用類型鑄造:

var foo = (Foo)bar; 

InvalidCastException,if該類型不是預期的。

+0

非常感謝! – ruffy 2014-12-05 08:39:52

1

在這種情況下,我更喜歡丹尼斯的建議。也就是說,你可能無法改變基類來使用它。如果是這樣的話,那麼你可以做一些事情不太好,但還是有用的:

class AbstractPerson 
{ 
    AbstractAttribute Attribute { get; set; } 
} 

class Pilot : AbstractPerson 
{ 
    PilotAttribute PilotAttribute 
    { 
     get { return (PilotAttribute)AbstractAttribute; } 
     set { AbstractAttribute = value; } 
    } 
} 

當然,這種方法要求PilotAttribute實際上是從AbstractAttribute得出,實際上並不在通用的解決方案需要的東西(除非你特別想要它)。它也不提供通用解決方案的安全級別:AbstractAttribute仍然存在,並且可以分配一個不是PilotAttribute類型的值。所以你必須小心不要這樣做(最好避免在處理Pilot的實例時使用base屬性)。

也可以簡單地隱藏基地AbstractAttribute屬性與一個新的。但我憎恨會員隱藏和恕我直言,所有在這裏會做的是讓代碼更混亂。

+0

是的,你是對的。感謝您的替代!我會考慮它,當它更實用! – ruffy 2014-12-05 08:41:05