我想为我的 Box 类创建一个只读接口。盒子里装有香蕉。 Bananas 有一个只读接口 IBananaRead。
问题是,在框代码中,我使用
List<Banana>
执行所有操作,但在只读接口中,我希望其他类不能访问 Banana,而是访问 IBananaReads。遇到此类情况如何解决?
class Box: IBoxRead
{
List<Banana> bananas;
}
interface IBoxRead {
List<IBananaRead> bananas;
}
我可以在 Box 中创建 IBananaRead 接口的重复列表,但由于重复,这似乎不正确。
class Box: IBoxRead
{
List<Banana> bananas;
List<IBananaRead> bananaReads;
}
interface IBoxRead {
List<IBananaRead> bananaReads;
}
最终目标是与 Box 进行两种类型的交互:
// A read-only class iterates over:
foreach (IBananaRead b in instanceOfBoxRead.bananas)
{
b.ReadTheBanana();
}
// Another class that has right to edit the bananas in the box iterates
// using the class Banana, not the readonly interface of IBananaRead:
foreach (Banana b in instanceOfBox.bananas)
{
b.EditTheBanana();
}
除非我遗漏了什么,否则你只需要这个:
var boxList = new List<Box>();
// ...
var iBoxReadList = boxList.Cast<IBoxRTead>().ToList();
这需要按需执行,即每次您需要只读项目列表时执行,因为它不会与原始列表一起更新。您可以声明一个只读属性并在 getter 中创建新列表。