首页 文章

通过继承实现接口

提问于
浏览
1

我有一个接口,需要实现方括号运算符 . 从中继承的类实现它 . 但是,它也继承自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 <>,它将自动实现 . 它没有按照我想要的方式进行淘汰 .

我收到错误'没有实现接口成员...' .

如何在不使字典成为私有成员的情况下解决这个问题?有办法吗?

1 回答

  • 4

    它真的需要派生自 Dictionary<string, Bar> 吗?根据我的经验,直接从 Dictionary<TKey, TValue>List<T> 等派生出来并不是一个好主意 - 只有明确设计用于继承的集合(例如Collection<T>)通常可以很好地适合继承 .

    你能不能让 ConcreteFoo 改为 Dictionary<string, Bar> 字段?你在最后一个问题中暗示了这一点,但是你不清楚为什么要尝试使用继承而不是组合 .

    如果你真的必须使用继承,你可以使用explicit interface implementation,如下所示:

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

    ......但我建议改用构图 .

相关问题