【问题标题】:Only allow certain subclasses in relationship OO-design仅允许关系 OO 设计中的某些子类
【发布时间】:2022-01-26 16:58:56
【问题描述】:

我有一个当前看起来像这样的设置:

如上所示,我有一个 System 类型,它有 3 个子类。这些系统中的每一个都可以有不同类型的身份验证方法,并且一个 System 实例将有一个 Authenticator 实例。这个想法是某些系统可以有自己的身份验证“策略”,也可能使用通用策略。但是,应该只允许每个系统使用系统特定的或某些“允许的”Authenticators

所以图中SystemA可以使用SystemA Quick AuthenticatorSystem A Reuse AuthenticatorGeneric Authenticator 2 . 系统 A 不应被允许使用,例如。 Generic Authenticator 1 或任何System B Authenticator。同样,System B 也有类似的设置,而 System C 只允许使用 Generic Authenticator 2。这种工作正常,但一旦我需要在 Base System A Authenticator 中实现一些基本逻辑就会失败,而 Generic Authenticator 2 也需要实现。 p>

我想使用某种组合而不是继承,并且有一个 System A Auth Handler,它只是链接到一个 BaseAuthenticator 并使用一些域逻辑来控制例如。 Generic Authenticator 1 从未使用过。然而,这似乎也不是一个很好的解决方案。

您是否知道如何实现这种子类“限制”设置,而无需进行手动类型检查且不影响 OO 原则(例如,接口隔离原则在当前设置中似乎已被严重破坏。 .)?

【问题讨论】:

  • 在我看来,显而易见的解决方案是向Generic Authenticator 2Base System A Authenticator 添加一个共同的祖先抽象类,而不是让它们都直接从Base Authenricator 继承。
  • 嗨 Zohar,是的,你的意思是,如果应该有任何 System A 特定细节,他们应该进入当前称为 Base System A Authenticator 的类?因为如果在 Generic 2 中需要它们,那么它实际上根本就不是通用的。
  • 是的,差不多
  • 我实际上采用了稍微不同的解决方案。我创建了一个继承自当前 System A Base Auth 的 System A Generic 2 Wrapper 类。这样,通用类不依赖于 System A 层次结构中的类(或接口),即使该方法通常可能会产生更多类。非常感谢 Zohar 的帮助,非常感谢,您的建议对我很有帮助。

标签: c# inheritance dependencies composition object-oriented-analysis


【解决方案1】:

对于那些感兴趣的人,我采用了以下解决方案。我引入了一个新的 System A Auth 类来包装 Generic 2 Authenticator。这不是一个完美的解决方案,但通用类对系统特定类没有任何依赖关系,这在我的情况下非常有用。

Zohar 在上述 cmets 中建议的不同方法可能是为系统 A 引入一个新的抽象级别(见下图)。这种方法当然有利于重用,但在我的场景中,更重要的是泛型类不依赖于系统特定类。

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多