2011-07-28 44 views
6

假設我有一個抽象基類BaseTimeCollection和至少一個從基類繼承的具體類ConcreteTimeCollection繼承ICollection的抽象基類<T>

我想我的基類從ICollection<T>繼承。

繼承ICollection<T>需要我提供許多方法的實現,包括IEnumerable.GetEnumerator()IEnumerable<T>.GetEnumerator

我不想實現BaseTimeCollection這些方法 - 而不是我寧願單獨實現它們在我的每一個具體類的。

這是我遇到麻煩的地方。

GetEnumerator方法必須加以明確聲明,因爲有兩個他們倆的名稱相同,但不同的返回類型。 但是,似乎只要我明確表示簽名,就不能再使用抽象修飾符。本質上,我被迫在我的基類中實現了GetEnumerator方法。

public abstract class BaseTimeCollection : ICollection<Time> 
{ 
    abstract IEnumerator IEnumerable.GetEnumerator(); // compile error: The modifier 'abstract' is not valid for this item 
    abstract IEnumerator<Time> IEnumerable<Time>.GetEnumerator(); // compile error: The  modifier 'abstract' is not valid for this item 
} 

public class ConcreteTimeCollection : BaseTimeCollection 
{ 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     // this is where I would like to provide my implementation for IEnumerable.GetEnumerator() 
    } 

    IEnumerator<Time> IEnumerable<Time>.GetEnumerator() 
    { 
     // this is where I would like to provide my implementation for IEnumerable<Time>.GetEnumerator() 
    } 
} 
  1. 有什麼我錯過了?

  2. 有一些方法我可以推遲實施GetEnumerator方法的具體類?

+0

什麼是你所得到的編譯錯誤? –

回答

6

您可以輕鬆地通過具有明確的實現來電保護的抽象方法在抽象類,然後讓孩子們實現這些抽象方法推遲執行到您的子類:

public abstract class BaseTimeCollection : ICollection<Time> 
{ 
    protected abstract IEnumerator IEnumerable_GetEnumerator(); 
    protected abstract IEnumerator<Time> GenericEnumerable_GetEnumerator(); 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return IEnumerable_GetEnumerator(); 
    } 

    IEnumerator<Time> IEnumerable<Time>.GetEnumerator() 
    { 
     return GenericEnumerable_GetEnumerator(); 
    } 
} 

對不起,可憐的命名方案......這是我一早就能想出的最好的方案。

+0

看起來應該這樣做 - 謝謝!在後見之明似乎很明顯:) – knick

+1

不需要有兩個抽象實現,因爲非泛型實現可以調用通用抽象方法。 – supercat

0

首先:你得到的編譯錯誤是什麼?

你需要你的基類,也許你可以用另一個接口,如:

public interface BaseTimeCollection : ICollection<Time> {} 

,然後讓你實現實現該接口,而不是你的基類,或者你有一些共同的功能?

+0

對於我的帖子中的示例代碼,我得到的編譯錯誤是「修飾符'摘要'對此項無效」。這個錯誤指向基類中的兩個抽象方法聲明。是的,我確實有一些通用功能在示例中已被省略。 – knick

0

這是沒有必要實施的GetEnumerator的兩個版本明確,以防止名稱衝突,所以除非有他們的另一個要求既要明確,你可以使通用的方法隱含因此,它也可以是抽象的。然後,根據@supercat,非泛型方法可以調用泛型方法。

public abstract class BaseTimeCollection<Time> : ICollection<Time> 
{ 
    public abstract IEnumerator<Time> GetEnumerator(); // implicit, generic and abstract 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    // Other ICollection methods (Add, Clear, etc) ... 
}