【问题标题】:Override base method call in all subclasses without inheriting each subclass (VB.NET)覆盖所有子类中的基方法调用而不继承每个子类(VB.NET)
【发布时间】:2012-08-10 12:59:08
【问题描述】:

出于测试目的,我需要重写一个特定的方法调用,该方法目前在基类中实现。

 Public Overridable Function CreateFactory(Of TFactory As {IManagerFactory(Of IManager), Class})() As TFactory

我想避免必须为该基类的每个现有子类创建一个继承类(即从 CLBase 等继承的 CLAccountManager 的 CLTestableAccountManager)。

Public Class CLTestableAccountManager
  Inherits CLAccountManager

    Public Overrides Function CreateFactory(Of TFactory As {IManagerFactory(Of IManager), Class})() As TFactory

虽然这可行,但由于适用于许多类,它会导致大量重复代码。 该方法只能在单元测试的上下文中使用时被覆盖,所以我不应该真正触及基类实现(它是虚拟的/可覆盖的)。

不幸的是,我不能简单地做类似的事情

Public Class CGenericBaseOverrider(Of TBase As {CLBase})
  Inherits TBase

实现一个通用的方法来覆盖 CLBase 的所有子类的方法。

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: .net vb.net inheritance virtual overriding


    【解决方案1】:

    你能用组合代替继承吗?

    换句话说,为了测试目的,创建一个实现相同接口的类型(如果没有接口,则引入一个接口)并将来自CreateFactory 的所有调用 apart 委托给任何生产您拥有的代码 - 但会为该一次调用执行您的自定义行为。

    【讨论】:

    • 我不确定这是否可行,也许是我对构图的理解不足。主要问题是继承自CLBase 的类自己调用CreateFactory 方法。 CreateFactory 具有难以解耦的依赖关系([Assembly]RemotingConfiguration 等),因此我想重写该方法以返回一个模拟对象。
    • @urbanhusky:哦,我明白了。嗯 - 这从来都不是很好。听起来确实值得将 CreateFactory 与类的其余部分分开,以便 CLBase 构造函数采用“工厂提供者”或其他任何东西......
    • 谢谢,这给了我一个想法。我已经在使用 IoC 容器,因此将 CreateFactory 功能分离到一个单独的类中可以让我为测试注入模拟生成类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2021-05-04
    • 2012-05-08
    • 2012-05-11
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多