gpt4 book ai didi

c# - 如何获取/设置并不总是实现的接口(interface)的属性

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:17 25 4
gpt4 key购买 nike

当该属性并不总是存在于实现同一接口(interface)的所有类中时,设置实现接口(interface)的类的属性的好方法(面向对象)是什么?

例如

假设我有一个接口(interface)

public interface IDataRepository {

public DataStructure GetData(); // DataStructure is an arbitrary class, doesn't matter for this example

}

现在我还有两个继承自这个的类

public class DatabaseRepository : IDataRepository {

public DataStructure GetData()
{
// get data from database
}
}

public class FileRepository : IDataRepository {

public string WorkingFolder { get; set; }

public DataStructure GetData() {
// get data from files
}
}

现在我的客户端方法不一定知道存储库是什么,但这是我想做的...

private DataStructure ReadData(IDataRepository repository)
{
repository.WorkingFolder = @"C:\Data"; // What is the best way of doing this?

return repository.GetData();
}

显然上面的代码行不通,我可以...

     if (repository is FileRepository) {
((FileRepository)repository).WorkingFolder = @"C:\Data";
}

或添加 WorkingFolder 作为接口(interface)的属性(因此所有实现它的类),即使在大多数情况下它是无关紧要的。

但是这两个(尤其是第一个)看起来很不优雅而且不是很面向对象。做这种事情的 oop 方法是什么?

编辑

明显的问题是,如果方法不知道repository 是什么,它如何知道WorkingFolder 的正确值...但以上内容已结束- 简化我正在尝试做的事情,所以我们就说它可以找出...

最佳答案

显然您的 ReadData 方法不能实际上接受任何类型的存储库。它只能处理 FileRepository。这是它所期望的,也是它完成工作所需要的。鉴于此,这就是它实际上应该接受的参数,而不是实际上不提供足以使其完成工作的契约的接口(interface)。

拥有接口(interface)的全部意义在于,任何使用该接口(interface)的人都可以使用它而不用关心实现是什么。因此,如果您确实想要使用该接口(interface),您需要在接口(interface)定义中包含足够的信息,以便它提供任何使用该接口(interface)的人所需的每个操作,否则您最好不要在全部(至少对于那个特定的操作)。

至于给出的特定示例,您可能应该只提供一个已经配置的存储库,它具有允许此方法执行其所需的任何值工作,作为参数。对于从任意存储库读取值的方法来配置该存储库是没有意义的。也就是说,如果它确实在从任意存储库中读取内容。

关于c# - 如何获取/设置并不总是实现的接口(interface)的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53121334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com