通过继承实现接口

本文关键字:接口 实现 继承 | 更新日期: 2023-09-27 18:18:04

我有一个需要实现方括号操作符的接口。继承它的类实现它。但是,它也继承了Dictionary<>,其中实现了相同的操作符:

public interface IFoo
{
    IBar this[String tFooName] { get; }
}

[Serializable]
public class ConcreteFoo: Dictionary<String, Bar>, IFoo
{
    // Implement interface by calling the dictionary
    public IBar this[String tFooName] { get { return this[tFooName]; } }

    // .... more code ....
}

当我尝试使用代码时,编译器引用了已实现的直接接口,并告诉我不能给它赋值:

MyClass[tKeyStr] = new Bar();

错误是正确的。因此,我删除了IFoo接口的实现,并希望通过继承Dictionary<>,它将自动实现。结果没有如我所愿。

我得到错误'不实现接口成员…'。

如果不让字典成为私有成员,我该如何解决这个问题??有办法吗?

通过继承实现接口

真的需要Dictionary<string, Bar>派生吗?根据我的经验,直接从Dictionary<TKey, TValue>, List<T>等派生很少是一个好主意-只有明确设计为继承的集合(例如Collection<T>)通常适合继承。

你能不能让你的ConcreteFoo有一个Dictionary<string, Bar> 字段代替?你在最后一个问题中暗示了这一点,但我不清楚为什么你要用继承而不是复合。

如果你真的必须使用继承,你可以使用显式接口实现,像这样:

IBar IFoo.this[String tFooName] { get { return this[tFooName]; } }

…但我建议你还是选择构图。