【问题标题】:How to switch classes with same name and different namespaces?如何切换具有相同名称和不同命名空间的类?
【发布时间】:2018-12-20 21:06:07
【问题描述】:

我已阅读博文Repository Design Pattern

本文的主要思想是强制转换具有相同名称的类以获得更多功能。没关系,我明白了。但我看不懂这段代码:

repository.query(new NewestNewsesSpecification());

他有NewestNewsesSpecification 用于sql 和NewestNewsesSpecification 用于Realm。

所以我的问题 - 如果类具有相同的名称但在不同的命名空间中,程序如何理解 NewestNewsesSpecification 的实现?它甚至不是 DI 框架。还是只是每次我需要不同的存储空间时,我都需要在源代码文件中查找和更改命名空间?

文章的代码是Java。我正在用 C# 编写。

【问题讨论】:

  • 坦率地说,这违背了接口的全部目的。在我看来,当你开始施法时,你就是在增加危险。

标签: java c# design-patterns


【解决方案1】:

我很快就读完了这篇文章。他正在解释存储库模式。这有助于封装实际使用的存储库的实现细节。这样您就可以在不修改客户端代码的情况下交换底层存储库。底层细节封装在Specification 类中。您必须明确地将这个基类的实现传递给存储库,例如进入“查询”方法。这是客户端必须通过创建适当的实例来决定使用(或查询)哪个存储库的地方。

如果您有多个实现共享相同的名称,那么它们需要驻留在不同的命名空间中以避免歧义。如果您假设编译器无法解决此冲突引用,那么您是对的。通常您必须完全限定类型(例如实例化、强制转换):'new Sql.NewestNewsesSpecification()' 或使用编译器指令 'using' 或 'import' 来声明适当的命名空间,以便可以使用缩写形式:'新的NewestNewsesSpecification()'。本文假设您包含“Sql”命名空间或“Realm”命名空间。我猜,主要想法是显示在替换底层存储库(上下文)时代码的哪些部分会发生变化。如果同时包含两个命名空间,则可以为其中一个实现指定别名或使用完全限定的引用,以使引用不再有歧义。

【讨论】:

  • 非常感谢您的回答。现在我知道我理解的都是正确的!但是,当我需要使用其他规范类时,如果我不想在 using 部分替换命名空间怎么办。我怎样才能快速切换它(也许在配置部分)?即使使用 IoC,我也无法理解如何制作它。
  • 您可以通过创建正确的规范类实现的实例来切换它。您始终必须完全限定您正在使用的类型。这意味着您必须通过使用它的完整路径来指向类型。这意味着您必须从包或组件走到类型。通常,包是通过添加对其包含的项目的引用来解决的。在这个包中,您有包含类型的命名空间。您必须向编译器或链接器显示在哪里查找类型以便解析。
  • 如果您不喜欢使用别名,我建议为每个子类型指定一个不同的名称:例如NewestNewsesSqlSpecification 和 NewestNewsesRealmSpecification。这也清楚地表明了这种类型的专门用途。
  • 这同样适用于任何国际奥委会。它必须进行相应的配置。这意味着您还定义了为抽象类型加载的具体实现。因为解析类型是编译器的责任,您仍然必须提供类型的完整路径或使用“using”指令使用短格式。
  • 谢谢。所以你的主要想法 - 如果我写了很多代码,我使用 concreate 实例(例如,对于 sql)然后我想切换到 xml,我需要编辑每个文件。因此,如果我只想编辑一次,我可以只加载程序集。对吗?
猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2015-07-18
  • 2011-12-01
  • 2013-04-17
  • 2014-01-12
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多