2012-07-09 90 views
0

我有下面的類層次:現在訪問抽象類的成員

public abstract class BaseClass : IBaseInterface 
{ 

    public int PropertyA{ 
     get 
     { 
      return this.propertyA; 
     } 

     set 
     { 
      this.propertyA = value; 
      // ... some additional processing ... 
     } 
    } 
} 

DerivedClassB : BaseClass 
{ 
    // some other fields 
} 

public class ContainingClassC 
{ 
    public IBaseInterface BaseInterfaceObjectD 
    { 
     get; 
     set; 
    } 
} 

,爲了訪問DerivedClassB-對象的PropertyA(從BaseClass的繼承),我有對象轉換爲BaseClassA的祖先,像這樣:

// This ContainingClassC is returned from a static, enum-like class: 
// containingObject.PropertyA is DerivedClassB by default. 
ContainingClassC containingObject = new ContainingClassC(); 

((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42; 

有沒有一種方法,我可以重組這些類來消除演員?這段代碼是圖書館的一部分,我的同事希望我擺脫演員陣容。

目標是簡單地寫containingObject.BaseInterfaceObjectD.PropertyA = 42

+0

您的描述和代碼並不一致。請把一個與另一個一致。 – Jon 2012-07-09 09:51:25

+0

對不起......正在努力。 – lowerkey 2012-07-09 10:01:59

+3

'((IBaseInterface)containsObject.BaseInterfaceObjectD)'這已經是接口類型。你爲什麼要演員? – leppie 2012-07-09 10:09:37

回答

0

首先在行((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42;中,您正在將該成員強制轉換爲與其聲明中相同的類型,因此該強制轉換實際上不會執行任何操作。

爲了能夠訪問派生類中的PropertyA - 因爲您將它轉換爲接口 - 必須在接口中聲明該屬性,然後在BaseClass中實現該屬性。

public interface IBaseInterface{ 
    int PropertyA{get;set;} 
} 

public abstract class BaseClass : IBaseInterface{ 
    public int PropertyA{ 
    get{ return this.propertyA;} 
    set {this.propertyA = value;} 
    } 
} 

只要接口正確實施,ProprtyA應在基類,派生類或其中一方cast'ed到接口類型可用。

如果這只是屬性在IntelliSense中未顯示的問題,那麼它可能是您的設置的問題。檢查選項 - >文本編輯器 - > C#並確保您已啓用智能感知,並且未設置爲隱藏anythig。

+0

儘可能簡單,這可能是問題所在。給定的實現不應該要求任何類型的轉換,因此,如果OP不得不轉換爲具體類型,那麼這可能是原因。 – James 2012-07-09 10:52:02