如果您有一个包含对象集合的接口,并且您希望同时使用接口的只读和读写版本,该怎么办?

本文关键字:接口 读写 只读 版本 怎么办 希望 对象 包含 有一个 集合 如果 | 更新日期: 2024-10-30 04:43:41

我目前正在为包含对象集合的用户控件创建一些接口。我想为可以从外部添加对象的控件提供一个接口,为不能从外部添加对象的控件提供另一个接口。到目前为止,我基本上有以下内容(针对此问题进行了简化;如果它可以帮助您查看我迄今为止的实际代码,请告诉我):

public interface IReadableFoo 
{
    IReadOnlyCollection<Foo> Foos { get; }
}
public interface IReadWriteFoo : IReadOnlyFoo 
{
    new ICollection<Foo> Foos { get; }
}
在这种情况下,

当您有一个包含对象集合的接口,并且您希望同时拥有只读版本和读写版本时,应该做什么?让一个ICollection<Foo>像这样遮蔽IReadOnlyCollection<Foo>被认为是可以接受的吗?

我应该使用其他模式吗?IReadOnlyFooIReadWriteFoo 都应该继承自公共基本接口IFoo吗?

编辑:为了澄清我正在尝试做什么,我在这里添加了我正在使用的实际代码:

public interface IOptionSelector<T>
{
    IReadOnlyCollection<T> Options { get; }
    T SelectedOption { get; }
    event EventHandler SelectedOptionChanged;
}
public interface IWriteableOptionSelector<T> : IOptionSelector<T>
{
    new ICollection<T> Options { get; }
    new T SelectedOption { get; set; }
}    

如果您有一个包含对象集合的接口,并且您希望同时使用接口的只读和读写版本,该怎么办?

这是你应该做的:

public interface IOptionSelector<T>
{
    event EventHandler SelectedOptionChanged;
}
public interface IReadOnlyOptionSelector<T> : IOptionSelector<T>
{
    IReadOnlyCollection<T> Options { get; }
}
public interface IWritableOptionsSelector<T> : IOptionSelector<T>
{
    ICollection<T> Options { get; }
}

只读和可写是两个独立的问题。 当您必须在编写的方法上使用 new 关键字时,这清楚地表明您正在处理单独的问题并需要重新考虑您的设计。