C#中的抽象显式接口实现

BCS*_*BCS 28 c# abstract-class interface

我有这个C#代码:

abstract class MyList : IEnumerable<T>
{
    public abstract IEnumerator<T> GetEnumerator();

    //abstract IEnumerator IEnumerable.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

就是这样,我得到:

'Type'没有实现接口成员'System.Collections.IEnumerable.GetEnumerator()'.

删除评论,我得到:

修饰符'abstract'对此项无效

如何制作显式实现摘要

Jon*_*eet 35

有趣 - 我不确定你能不能.但是,如果这是你真正的代码,你有没有希望实现非通用GetEnumerator()以任何方式通过调用通用的人比?

我这样做:

abstract class MyList<T> : IEnumerable<T>
{
    public abstract IEnumerator<T> GetEnumerator();

    IEnumerator IEnumerable.GetEnumerator() 
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

这使您免于必须在每个派生类中实现它的繁琐 - 这无疑都会使用相同的实现.

  • 我没有理由认为它会以任何其他方式实现......但你永远不会知道.+1 (2认同)
  • 重新评论 - 我可能误读了它...编辑修复它,发现代码与你的相同 - 所以删除了;-p (2认同)

Ste*_*sen 17

虽然显式接口成员可能不是抽象(或虚拟),但它可以根据抽象(或虚拟)成员1来实现:

public abstract class Foo: IEnumerable {
    IEnumerator IEnumerable.GetEnumerator() { 
        return getEnumerator();    
    }

    protected abstract IEnumerator getEnumerator(); 
}

public class Foo<T>: Foo, IEnumerable<T> {
    private IEnumerable<T> ie;
    public Foo(IEnumerable<T> ie) {
        this.ie = ie;
    }

    public IEnumerator<T> GetEnumerator() {
        return ie.GetEnumerator();
    }

    protected override IEnumerator getEnumerator() {
        return GetEnumerator();
    }

    //explicit IEnumerable.GetEnumerator() is "inherited"
}
Run Code Online (Sandbox Code Playgroud)

我发现在强类型的ASP.NET MVC 3局部视图中需要这个,它不支持泛型类型定义模型(据我所知).