簡體   English   中英

繼承ICollection <T>的抽象基類

[英]Abstract base class that inherits ICollection<T>

假設我有一個抽象基類BaseTimeCollection和至少一個BaseTimeCollection類的具體類ConcreteTimeCollection

我希望我的基類繼承ICollection<T>

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

我不想在BaseTimeCollection實現這些方法 - 相反,我更願意在每個具體類中單獨實現它們。

這是我遇到麻煩的地方。

需要顯式聲明GetEnumerator方法,因為它們中的兩個具有相同的名稱但返回類型不同。 但是,似乎只要我使簽名顯式,我就不能再使用abstract修飾符了。 基本上我被迫在我的基類中實現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方法的實現推遲到具體類?

通過讓顯式實現在抽象類中調用受保護的抽象方法,然后讓子級實現這些抽象方法,您可以輕松地將實現推遲到子類:

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();
    }
}

抱歉這個糟糕的命名方案......這是我早上最好能想到的。

沒有必要顯式地實現兩個版本的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) ...
}

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

你需要你的基類,也許你可以使用另一個界面,如:

public interface BaseTimeCollection : ICollection<Time> {}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM