2014-09-29 43 views
1

我對如何實現這個有點困惑。接口參數

我已經在int中定義了一個名爲IActivity的接口。

我已經然後創建了一個實現此接口並添加了一些額外的屬性

EngagementActivity和MPEngagementActivity兩班。爲了清楚起見,這兩個類實現了IActivity並聲明瞭一些額外的屬性

然後我有一個名爲ActivitySvc的基類,它將實現這兩​​種活動通用的所有功能的虛擬方法。

我然後實現從基類派生並必須提供自己的實現在基類中聲明的SaveActivity方法兩大類:

public abstract void SaveActivity(IActivity activity); 

我的問題是執行的時候,我收到錯誤SaveActivity方法,因爲我的活動對象是IActivity類型,因此它沒有特定於EngagementActivity和MPEngagementActivity類的成員。

我在做什麼錯?

在此先感謝。

+0

當使用界面,你通常*不*關心什麼是基礎數據,只是它實現了接口。聽起來就像你試圖違反這一點。 – crashmstr 2014-09-29 14:57:16

+0

這些來自IActivity具體類的不同成員代表什麼?您可以將它隱藏在EngagementActivity和MPEngagementActivity類中,並將邏輯包裝到通過IActivity公開的常用方法中,而不是直接從SaveActivity方法訪問它們。 – 2014-09-29 16:56:50

回答

3

雖然它不一定是最好/最正確的方法,但最快的方法是嘗試並安全地將您的活動對象轉換爲相關方法中正確的類型。

例如,在使用EngagementActivity類,你可以不喜歡這樣:

public override void SaveActivity(IActivity activity) 
{ 
    var engagementActivity = activity as EngagementActivity; 
    if (engagementActivity != null) // it's the correct type 
    { 
     // Do whatever's needed here 
    } 
} 

如果engagementActivity變量爲空,這不是你想投它作爲類型。有關'as'的更多信息,請參閱this MSDN article

+0

這就是我最終做的,但不知何故它似乎並不高雅...... – franklores 2014-09-30 15:46:16

1

在SaveActivity中獲取IActivity的基礎類型並獲取您的屬性。 您可以定義抽象類的虛方法,你可以不覆蓋

public virtual void SaveActivity(IActivity activity) 
{ 
    ... 
    // some common code for all types 
    if(activity is EngagementActivity) 
    { 
     // use explicit type casting '(EngagementActivity)activity' and get your properties 
     // save your data 
     return; 
    } 
    if(activity is MPEngagementActivity) 
    { 
     // use explicit type casting '(MPEngagementActivity)activity' and get your properties 
     // save your data 
     return; 
    } 
    // other activity types 
    ... 
    // if no case fired save data for common activity or throw exception for unknown type 
} 
+0

我聲明SaveActivity方法是抽象的,因爲實現根據Activity有很大的不同,但我確實實現了將對象轉換爲正確的類型。 – franklores 2014-09-30 15:47:14