gpt4 book ai didi

c# - 在不破坏封装的情况下创建对象

转载 作者:行者123 更新时间:2023-11-30 21:25:19 25 4
gpt4 key购买 nike

我对这一切还很陌生,所以这可能是 OOP 101,但我无法理解它,假设以下 C# 代码存在于程序集中:

internal interface IDataStore
{
void Store(string name, object data);
object Retrieve(string name);
}

internal class DBStore : IDataStore
{
public DBStore(string connection) { }
public void Store(string name, object data) { }
public object Retrieve(string name) { }
}

public class GizmoManager
{
public GizmoManager(IDataStore dataStore) { }
// Other stuff
}

public class WidgetManager
{
public WidgetManager(IDataStore dataStore) { }
// Other stuff
}

如果第二个程序集试图创建一个 GizmoManager 和一个 WidgetManager,它不能,因为它无法获得 DBStore(因为它是内部的而不是公共(public)的)。

以下内容不适用于 AFAICS:

  • 公开 DBStore 和 IDataStore。很糟糕,因为客户端程序集随后可以绕过 GizmoManager/WidgetManager 并随心所欲地访问数据库。
  • 不要将 IDataStore 传递给 GizmoManager 和 WidgetManager 构造函数。不好是因为它降低了可测试性(您不能轻易传入 MockDataStore)。
  • 用工厂做一些神奇的事情。似乎没有解决任何问题,因为您需要将相同的 IDataStore 传递给 GizmoManager 和 WidgetManager,因此客户端程序集仍然需要将 IDataStore 分配给变量(这不能,因为 IDataStore 是内部变量)。

这可能非常明显,但我就是看不到。如何克服这一矛盾?

TIA。

最佳答案

只需公开接口(interface) IDataStore 即可。这样,客户可以使用他们自己创建的模拟对象来实例化您的 WidgetManagerGizmoManager 类。

实现 Factory 类设计模式,允许客户端代码创建 GiszmoManagerWidgetManager 对象。这样,客户端代码永远无法创建 DBStore 对象,因此它们永远无法绕过您的管理器。

顺便说一句: 为什么要为封装而烦恼?如果您从事专有框架业务,这可能有意义,否则,YAGNI .

关于c# - 在不破坏封装的情况下创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/713490/

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