【发布时间】:2017-10-13 08:46:46
【问题描述】:
这是一个极其简化的问题描述。鉴于我有这个:
interface IMyClass {
IList<int> MyList { get; set; }
void AddToList(int newVal);
}
public class MyClass: IMyClass {
public IList<int> MyList { get; set; }
public void AddToList(int newVal)
{
// custom implementation goes here
MyList.Add(newVal);
}
}
我得到了一个接口IMyClass,我无法更改。任务是实现这个接口以及addToList 方法。
问题是,即使我实现了addToList 方法——用户仍然有可能通过MyList 属性的直接访问来添加项目!
有没有办法禁止用户直接在列表中使用Add()、Remove()、Insert()?
到目前为止,我已经尝试实现一个自定义的MyList<T> 类,但问题是我必须实现所有可能的IList<T> 方法,但我只需要其中一些方法的自定义实现,而不是全部..或者有其他方法吗?
【问题讨论】:
-
您应该将 MyList 属性设为私有。
-
根据您的列表授予对只读列表的访问权限并将您的列表设为私有
-
Ummm... 我要采取相反的观点并说:你根本不应该这样做。您将其视为,“嘿,这打破了封装,让任何人从任何地方设置我的列表。”但是...这就是接口指示的内容。如果我正在编程并使用实现该接口的东西,我会期望我可以一次添加一个项目,或者直接设置完整列表。如果你做你想做的事,你基本上是在违反合同——你让它的行为与界面所指示的不同。
-
稍微扩展前面的评论:假设您有 List
。您应该能够遍历该列表,在每个 item.MyList 上调用 Set。它可以工作......除非列表中的一项是您对接口的特定实现(阻止列表设置功能)。我越想越觉得:接口可能有问题,但如果你不能改变它,如果你不得不用你的类,你应该根据它的规范来实现它。